今天在CSDN论坛里看到这么一个帖子
http://topic.csdn.net/u/20080731/15/40e3def0-b584-49cf-be65-d03712498ab2.html?seed=124496120,就是要在按下“显示桌面”时还要显示窗口。最初只是简单的回答了一个active一下。然后自己一试验,这样完全做不到。根据经验猜想,Activate()只是激活,但是在“显示桌面”后,还是不能把窗体显示出来。找遍所有的Form里的方法,都没有一个可以恢复窗口的。
这样看来,只能让程序自己模拟点击恢复的消息了。
迅速的开始google所有关于“最小化,还原窗体”的系统消息,却怎么都搜不出来。凭借自己的经验,系统里肯定是有这样的消息的。于是乎,自己把form的所有消息都打印出来,自己一个一个分析。
先初始化一个全局变量 StreamWriter sw = new StreamWriter("1.txt");和 bool flag = false;
然后再重载 void WndProc(ref Message m)
但是,我怎么都没有找到让窗体最小化的消息。可能是找的时候漏掉了吧?
这样看来,只能让程序自己模拟点击恢复的消息了。
迅速的开始google所有关于“最小化,还原窗体”的系统消息,却怎么都搜不出来。凭借自己的经验,系统里肯定是有这样的消息的。于是乎,自己把form的所有消息都打印出来,自己一个一个分析。
先初始化一个全局变量 StreamWriter sw = new StreamWriter("1.txt");和 bool flag = false;
然后再重载 void WndProc(ref Message m)
protected override void WndProc(ref Message m)
{
if(sw.BaseStream != null)
if(flag)
sw.WriteLine("0x" + m.Msg.ToString("X") + "/t0x" + m.WParam.ToString("X") + "/t0x" + m.LParam.ToString("X"));
else
sw.WriteLine(" 0x" + m.Msg.ToString("X") + "/t0x" + m.WParam.ToString("X") + "/t0x" + m.LParam.ToString("X"));
base.WndProc(ref m);
}
再加入这样一个事件
private void Form1_Resize(object sender, EventArgs e)
{
flag = true;
sw.WriteLine("---------------");
}
修改重载的
void Dispose(bool disposing)方法
protected override void Dispose(bool disposing)
{
if(disposing && (components != null))
{
components.Dispose();
}
sw.Flush();
sw.Close();
base.Dispose(disposing);
} 然后运行程序。程序运行的时候,尽量少的减少鼠标在窗体上的移动和点击,也不要按任何键盘按键。点击最小化,再还原窗体,然后关闭窗体。打开生成的
1.txt文件
0x24 0x0 0x61CDFD8
0x81 0x0 0x61CDF80
0x83 0x0 0x61CDFF8
0x1 0x0 0x61CDF6C
0xC 0x0 0x22283DC
0x80 0x0 0x71D0A01
0x80 0x1 0x6860979
0xE 0x0 0x0
0xD 0xC 0x4E548C8
0xE 0x0 0x0
0xD 0xC 0x4E548C8
0x7C 0xFFFFFFF0 0x61CE4DC
0x7D 0xFFFFFFF0 0x61CE4DC
0x7F 0x2 0x0
0x7C 0xFFFFFFEC 0x61CE4DC
0x7D 0xFFFFFFEC 0x61CE4DC
0x46 0x0 0x61CE528
0x83 0x1 0x61CE4FC
0x47 0x0 0x61CE528
0x18 0x1 0x0
0xE 0x0 0x0
0xD 0xC 0x4E548E8
0x46 0x0 0x61CE5E4
0x46 0x0 0x61CE5E4
0x1C 0x1 0x1370
0x86 0x1 0x0
0x6 0x1 0x0
0x281 0x1 0xC000000F
0x282 0x2 0x0
0x7 0x0 0x0
0x85 0x1 0x0
0x14 0x6E011439 0x0
0xE 0x0 0x0
0xD 0xC 0x4E548E8
0x47 0x0 0x61CE5E4
0x5 0x0 0x108011C
0x3 0x0 0xA60092
0xC1D5 0x0 0x0
0xF 0x0 0x0
0xE 0x0 0x0
0xD 0xC 0x4E548E8
0x7F 0x2 0x0
0x7F 0x0 0x0
0x7F 0x1 0x0
0x7F 0x0 0x0
0x7F 0x1 0x0
0x84 0x0 0x8A015E
0x84 0x0 0x8A015E
0x20 0x6093A 0x200000C
0xAE 0x1001 0x0
0xA0 0xC 0x8A015E
0x20 0x6093A 0x2000008
0xA0 0x8 0x8C015E
0x20 0x6093A 0x2000008
0xA0 0x8 0x8D015E
0x20 0x6093A 0x2000008
0xA0 0x8 0x8E015E
0x20 0x6093A 0x2000008
0xA0 0x8 0x8F015E
0x20 0x6093A 0x2000008
0xA0 0x8 0x91015E
0x20 0x6093A 0x2000008
0xA0 0x8 0x92015E
0x20 0x6093A 0x2000008
0xA0 0x8 0x93015E
0x20 0x6093A 0x2000008
0xA0 0x8 0x94015E
0x20 0x6093A 0x2000008
0xA0 0x8 0x95015E
0x20 0x6093A 0x2010008
0xA1 0x8 0x95015E
0x215 0x0 0x0
0x112 0xF020 0x95015E
0x8 0x0 0x0
0x281 0x0 0xC000000F
0x282 0x1 0x0
0x46 0x0 0x61CD464
0x24 0x0 0x61CCBD8
0x83 0x1 0x61CD438
0x47 0x0 0x61CD464
0xAE 0x1001 0x0
0xAE 0x1001 0x0
0xAE 0x1001 0x0
0x3 0x0 0x83008300
0xE 0x0 0x0
0xD 0xC 0x4E3B110
---------------
0x5 0x1 0x0
0x86 0x0 0x0
0x6 0x200000 0x0
0x1C 0x0 0x1490
0x2A2 0x0 0x0
0x46 0x0 0x61CE5D4
0x47 0x0 0x61CE5D4
0x1C 0x1 0x844
0x86 0x200001 0x0
0x6 0x200001 0x0
0x112 0xF120 0x0
0x13 0x0 0x0
0x46 0x0 0x61CDD74
0x24 0x0 0x61CD4E8
0x83 0x1 0x61CDD48
0x85 0x1 0x0
0x14 0xEA0113A8 0x0
0xAE 0x1001 0x0
0xAE 0x1001 0x0
0xAE 0x1001 0x0
0xE 0x0 0x0
0xD 0xC 0x4E54908
0x47 0x0 0x61CDD74
0x3 0x0 0xA60092
0xE 0x0 0x0
0xD 0xC 0x4E54928
---------------
0x5 0x0 0x108011C
0xE 0x0 0x0
0xD 0xC 0x4E54908
0xE 0x0 0x0
0xD 0xC 0x4E54908
0x281 0x1 0xC000000F
0x282 0x2 0x0
0x7 0x0 0x0
0x6 0x1 0x0
0xF 0x0 0x0
0xE 0x0 0x0
0xD 0xC 0x4E548E8
0x84 0x0 0x8A01A8
0x84 0x0 0x8A01A8
0x20 0x6093A 0x200000E
0xAE 0x1001 0x0
0xA0 0xE 0x8A01A8
0x20 0x6093A 0x2000014
0xA0 0x14 0x8B01A8
0x20 0x6093A 0x2000014
0xA0 0x14 0x8C01A7
0x20 0x6093A 0x2000014
0xA0 0x14 0x8D01A6
0x20 0x6093A 0x2000014
0xA0 0x14 0x8E01A6
0x20 0x6093A 0x2000014
0xA0 0x14 0x8F01A6
0x20 0x6093A 0x2000014
0xA0 0x14 0x9001A6
0x20 0x6093A 0x2000014
0xA0 0x14 0x9001A5
0x20 0x6093A 0x2000014
0xA0 0x14 0x9101A5
0x20 0x6093A 0x2000014
0xA0 0x14 0x9101A5
0x20 0x6093A 0x2000014
0xA0 0x14 0x9101A5
0x20 0x6093A 0x2000014
0xA0 0x14 0x9101A5
0x20 0x6093A 0x2000014
0xA0 0x14 0x9101A5
0x20 0x6093A 0x2000014
0xA0 0x14 0x9101A5
0x20 0x6093A 0x2010014
0xA1 0x14 0x9101A5
0x215 0x0 0x0
0x112 0xF060 0x9101A5
0x10 0x0 0x0
在第二个“---------------”前尝试消息代码。最后尝试出
0x112, 0xF120, 0x0这一组是恢复窗口的系统消息。最后,把这个消息放在一个
timer里,每隔100ms激发一次
private void timer1_Tick(object sender, EventArgs e)
{
int[] i = { 0x112, 0xF120, 0x0 };
this.Activate();
Message m = Message.Create(this.Handle, i[0], (IntPtr)i[1], (IntPtr)i[2]);
WndProc(ref m);
this.Activate();
} 这样就完成了整个项目的研究。
但是,我怎么都没有找到让窗体最小化的消息。可能是找的时候漏掉了吧?
本文通过分析Windows消息机制,成功找到了模拟还原最小化窗口的系统消息。作者详细记录了从初步猜测到最终确定消息代码的过程,并实现了定时触发该消息以保持窗口可见的功能。
1591

被折叠的 条评论
为什么被折叠?



