我用SPY++监控WM_ACTIVATE消息,奇怪的是..
我用SPY++监控WM_ACTIVATE消息,本来“记事本”是最小化的,我在任务栏上点击它, 表示激活它,然后马上停止SPY++的监控,发现会收到多个:WM_ACTIVATE消息, 这是为什么呢,哪位兄弟解释一下..谢谢。
下面是我收到的所有消息,我仅仅只点击了一下“记事本”,让它显示而已,却收到这么多消息,why?
<00001> 00040C5C S WM_WINDOWPOSCHANGING lpwp:0013FE8C
<00002> 00040C5C R WM_WINDOWPOSCHANGING
<00003> 00040C5C S WM_NCPAINT hrgn:00000001
<00004> 00040C5C S WM_GETTEXT cchTextMax:510 lpszText:0013F3A0
<00005> 00040C5C R WM_GETTEXT cchCopied:41 lpszText:0013F3A0 ("记事本 - [D:\study\vc\Hook\监控Win窗口的数目问?..")
<00006> 00040C5C R WM_NCPAINT
<00007> 00040C5C S WM_ERASEBKGND hdc:7701147C
<00008> 00040C5C R WM_ERASEBKGND fErased:False
<00009> 00040C5C S WM_WINDOWPOSCHANGED lpwp:0013FE8C
<00010> 00040C5C R WM_WINDOWPOSCHANGED
<00011> 00040C5C S WM_ACTIVATEAPP fActive:True dwThreadID:00001B14
<00012> 00040C5C R WM_ACTIVATEAPP
<00013> 00040C5C S WM_NCACTIVATE fActive:True
<00014> 00040C5C R WM_NCACTIVATE
<00015> 00040C5C S WM_ACTIVATE fActive:WA_ACTIVE fMinimized:False hwndPrevious:(null)
<00016> 00040C5C S WM_IME_SETCONTEXT fSet:1 (LONG)iShow:C000000F
<00017> 00040C5C S WM_IME_NOTIFY dwCommand:00000002 dwData:00000000
<00018> 00040C5C R WM_IME_NOTIFY
<00019> 00040C5C R WM_IME_SETCONTEXT
<00020> 00040C5C S WM_SETFOCUS hwndLoseFocus:(null)
<00021> 00040C5C S WM_KILLFOCUS hwndGetFocus:00060C2C
<00022> 00040C5C R WM_KILLFOCUS
<00023> 00040C5C S WM_IME_SETCONTEXT fSet:0 (LONG)iShow:C000000F
<00024> 00040C5C R WM_IME_SETCONTEXT
<00025> 00040C5C R WM_SETFOCUS
<00026> 00040C5C S WM_NCACTIVATE fActive:False
<00027> 00040C5C R WM_NCACTIVATE fDeactivateOK:True
<00028> 00040C5C S WM_FLOATSTATUS wFloatState:FS_ACTIVATE
<00029> 00040C5C R WM_FLOATSTATUS
<00030> 00040C5C R WM_ACTIVATE
<00031> 00040C5C P WM_PAINT hdc:00000000
<00032> 00040C5C P message:0xC29A [Registered:"MsgCheckModify"] wParam:00000000 lParam:00000000
<00033> 00040C5C P WM_KICKIDLE
<00034> 00040C5C S WM_SYNCPAINT
<00035> 00040C5C S WM_NCPAINT hrgn:7E0408C0
<00036> 00040C5C S WM_GETTEXT cchTextMax:510 lpszText:0013F0DC
<00037> 00040C5C R WM_GETTEXT cchCopied:41 lpszText:0013F0DC ("记事本 - [D:\study\vc\Hook\监控Win窗口的数目问?..")
<00038> 00040C5C R WM_NCPAINT
<00039> 00040C5C S WM_ERASEBKGND hdc:4D010C41
<00040> 00040C5C R WM_ERASEBKGND fErased:False
<00041> 00040C5C R WM_SYNCPAINT
<00042> 00040C5C P WM_PAINT hdc:00000000
<00043> 00040C5C S WM_NCACTIVATE fActive:False
<00044> 00040C5C S WM_GETTEXT cchTextMax:510 lpszText:0013F30C
<00045> 00040C5C R WM_GETTEXT cchCopied:41 lpszText:0013F30C ("记事本 - [D:\study\vc\Hook\监控Win窗口的数目问?..")
<00046> 00040C5C R WM_NCACTIVATE fDeactivateOK:True
<00047> 00040C5C S WM_ACTIVATE fActive:WA_INACTIVE fMinimized:False hwndPrevious:(null)
<00048> 00040C5C S WM_NCACTIVATE fActive:False
<00049> 00040C5C S WM_GETTEXT cchTextMax:510 lpszText:0013F024
<00050> 00040C5C R WM_GETTEXT cchCopied:41 lpszText:0013F024 ("记事本 - [D:\study\vc\Hook\监控Win窗口的数目问?..")
<00051> 00040C5C R WM_NCACTIVATE fDeactivateOK:True
<00052> 00040C5C S WM_FLOATSTATUS wFloatState:FS_DEACTIVATE
<00053> 00040C5C R WM_FLOATSTATUS
<00054> 00040C5C R WM_ACTIVATE
<00055> 00040C5C S WM_ACTIVATEAPP fActive:False dwThreadID:0000051C
<00056> 00040C5C R WM_ACTIVATEAPP
<00057> 00040C5C P WM_KICKIDLE
[解决办法]
这个时候,系统做了几个事情,首先你的记事本激活了,一次,任务栏激活了,一次,本来的顶层窗口失焦了,又激活一次
------解决方案--------------------
00040C5C S WM_ACTIVATE fActive:WA_ACTIVE fMinimized:False hwndPrevious:(null)
其中S代表发送,发送给原来Active的窗口。
00040C5C R WM_ACTIVATE
其中的R代表是记事本收到了该消息。现在Active的窗口是记事本。
[解决办法]
我刚做了一下测试,我的机器上是四个WM_ACTIVATE消息
<00001> 001403FA S WM_NCACTIVATE fActive:True
<00002> 001403FA R WM_NCACTIVATE
<00003> 001403FA S WM_WINDOWPOSCHANGING lpwp:0007FE98
<00004> 001403FA R WM_WINDOWPOSCHANGING
<00005> 001403FA S WM_WINDOWPOSCHANGED lpwp:0007FE98
<00006> 001403FA R WM_WINDOWPOSCHANGED
<00007> 001403FA P WM_SYSCOMMAND uCmdType:SC_RESTORE xPos:0 yPos:0 (used mnemonic)
<00008> 001403FA S WM_QUERYOPEN
<00009> 001403FA R WM_QUERYOPEN fOpenIsOk:True
<00010> 001403FA S WM_GETTEXT cchTextMax:510 lpszText:0007F424
<00011> 001403FA R WM_GETTEXT cchCopied:21 lpszText:0007F424 ("癳鷁 ")
<00012> 001403FA S WM_WINDOWPOSCHANGING lpwp:0007FC4C
<00013> 001403FA S .WM_GETMINMAXINFO lpmmi:0007FA14
<00014> 001403FA R .WM_GETMINMAXINFO lpmmi:0007FA14
<00015> 001403FA R WM_WINDOWPOSCHANGING
<00016> 001403FA S WM_NCCALCSIZE fCalcValidRects:True lpncsp:0007FC20
<00017> 001403FA R WM_NCCALCSIZE fuValidRect:0000 lpncsp:0007FC20
<00018> 001403FA S WM_NCPAINT hrgn:00000001
<00019> 001403FA R WM_NCPAINT
<00020> 001403FA S WM_ERASEBKGND hdc:31010578
<00021> 001403FA R WM_ERASEBKGND fErased:True
<00022> 001403FA S WM_WINDOWPOSCHANGED lpwp:0007FC4C
<00023> 001403FA S .WM_MOVE xPos:693 yPos:633
<00024> 001403FA R .WM_MOVE
<00025> 001403FA S .WM_SIZE fwSizeType:SIZE_RESTORED nWidth:918 nHeight:500
<00026> 001403FA R .WM_SIZE
<00027> 001403FA S .WM_WINDOWPOSCHANGING lpwp:0007F8A8
<00028> 001403FA R .WM_WINDOWPOSCHANGING
<00029> 001403FA S .WM_NCCALCSIZE fCalcValidRects:True lpncsp:0007F87C
<00030> 001403FA R .WM_NCCALCSIZE fuValidRect:0000 lpncsp:0007F87C
<00031> 001403FA S .WM_NCPAINT hrgn:00000001
<00032> 001403FA R .WM_NCPAINT
<00033> 001403FA S .WM_ERASEBKGND hdc:C5010829
<00034> 001403FA R .WM_ERASEBKGND fErased:True
<00035> 001403FA S .WM_WINDOWPOSCHANGED lpwp:0007F8A8
<00036> 001403FA R .WM_WINDOWPOSCHANGED
<00037> 001403FA R WM_WINDOWPOSCHANGED
<00038> 001403FA S .WM_IME_SETCONTEXT fSet:1 (LONG)iShow:C000000F
<00039> 001403FA S ...WM_IME_NOTIFY dwCommand:00000002 dwData:00000000
<00040> 001403FA R ...WM_IME_NOTIFY
<00041> 001403FA R .WM_IME_SETCONTEXT
<00042> 001403FA S WM_SETFOCUS hwndLoseFocus:(null)
<00043> 001403FA S .WM_KILLFOCUS hwndGetFocus:001302EA
<00044> 001403FA S ...WM_COMMAND wNotifyCode:EN_KILLFOCUS wID:15 hwndCtl:001302EA
<00045> 001403FA R ...WM_COMMAND
<00046> 001403FA R .WM_KILLFOCUS
<00047> 001403FA S ..WM_IME_SETCONTEXT fSet:0 (LONG)iShow:C000000F
<00048> 001403FA R ..WM_IME_SETCONTEXT
<00049> 001403FA S ..WM_COMMAND wNotifyCode:EN_SETFOCUS wID:15 hwndCtl:001302EA
<00050> 001403FA R ..WM_COMMAND
<00051> 001403FA R WM_SETFOCUS
<00052> 001403FA S WM_ACTIVATE fActive:WA_ACTIVE fMinimized:False hwndPrevious:(null)
<00053> 001403FA S ..WM_COMMAND wNotifyCode:EN_KILLFOCUS wID:15 hwndCtl:001302EA
<00054> 001403FA R ..WM_COMMAND
<00055> 001403FA S ..WM_IME_SETCONTEXT fSet:1 (LONG)iShow:C000000F
<00056> 001403FA R ..WM_IME_SETCONTEXT
<00057> 001403FA S .WM_SETFOCUS hwndLoseFocus:001302EA
<00058> 001403FA S ..WM_KILLFOCUS hwndGetFocus:001302EA
<00059> 001403FA S ....WM_COMMAND wNotifyCode:EN_KILLFOCUS wID:15 hwndCtl:001302EA
<00060> 001403FA R ....WM_COMMAND
<00061> 001403FA R ..WM_KILLFOCUS
<00062> 001403FA S ...WM_IME_SETCONTEXT fSet:0 (LONG)iShow:C000000F
<00063> 001403FA R ...WM_IME_SETCONTEXT
<00064> 001403FA S ...WM_COMMAND wNotifyCode:EN_SETFOCUS wID:15 hwndCtl:001302EA
<00065> 001403FA R ...WM_COMMAND
<00066> 001403FA R .WM_SETFOCUS
<00067> 001403FA R WM_ACTIVATE
<00068> 001403FA P WM_PAINT hdc:00000000
<00069> 001403FA S .WM_CTLCOLOREDIT hdcEdit:C5010829 hwndEdit:001302EA
<00070> 001403FA R .WM_CTLCOLOREDIT hBrush:01100061
<00071> 001403FA S .WM_CTLCOLOREDIT hdcEdit:C5010829 hwndEdit:001302EA
<00072> 001403FA R .WM_CTLCOLOREDIT hBrush:01100061
<00073> 001403FA S WM_CTLCOLOREDIT hdcEdit:C5010829 hwndEdit:001302EA
<00074> 001403FA R WM_CTLCOLOREDIT hBrush:01100061
<00075> 001403FA S WM_CTLCOLOREDIT hdcEdit:C5010829 hwndEdit:001302EA
<00076> 001403FA R WM_CTLCOLOREDIT hBrush:01100061
<00077> 001403FA S WM_NCACTIVATE fActive:False
<00078> 001403FA R WM_NCACTIVATE fDeactivateOK:True
<00079> 001403FA S WM_ACTIVATE fActive:WA_INACTIVE fMinimized:False hwndPrevious:(null)
<00080> 001403FA R WM_ACTIVATE
<00081> 001403FA S WM_ACTIVATEAPP fActive:False dwThreadID:000007DC
<00082> 001403FA R WM_ACTIVATEAPP
<00083> 001403FA S .WM_COMMAND wNotifyCode:EN_KILLFOCUS wID:15 hwndCtl:001302EA
<00084> 001403FA R .WM_COMMAND
[解决办法]
这样子就比较解释了。
前面两个消息动作是记事本窗口被激活 WM_ACTIVATE fActive:WA_ACTIVE fMinimized:False hwndPrevious:(null)
后两个消息动作是记事本失去焦点 WM_ACTIVATE fActive:WA_INACTIVE fMinimized:False hwndPrevious:(null)
[解决办法]
激活激发一次,失去激活激发一次
The WM_ACTIVATE message is sent to both the window being activated and the window being deactivated. If the windows use the same input queue, the message is sent synchronously, first to the window procedure of the top-level window being deactivated, then to the window procedure of the top-level window being activated. If the windows use different input queues, the message is sent asynchronously, so the window is activated immediately.
[解决办法]