今天在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(); }这样就完成了整个项目的研究。
但是,我怎么都没有找到让窗体最小化的消息。可能是找的时候漏掉了吧?