我用SPY++监控WM_ACTIVATE消息,奇怪的是..

xiangding 2009-08-25 05:39:26
我用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
...全文
398 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuerilangzi 2011-12-08
  • 打赏
  • 举报
回复
当你激活记事本,两个,
当你停止SPY++的监控,两个。
xuerilangzi 2011-12-08
  • 打赏
  • 举报
回复
The WM_ACTIVATE message is sent to both the window being activated and the window being deactivated.
WM_ACTIVATE 消息会给被激活的窗口发一个,也会给被失去激活的窗口发一个。

因为一个窗口要被激活,那么先前的激活窗口必须被失去激活。
因为桌面只能有一个激活窗口!!!
雪影 2009-08-26
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 xiangding 的回复:]
引用 6 楼 tttyd 的回复:
这样子就比较解释了。
前面两个消息动作是记事本窗口被激活 WM_ACTIVATE fActive:WA_ACTIVE fMinimized:False hwndPrevious:(null)
后两个消息动作是记事本失去焦点WM_ACTIVATE fActive:WA_INACTIVEfMinimized:False hwndPrevious:(null)


为什么会有两个激活的消息呢, 按理只要一个就行了,
[/Quote]
见5#,我在上面都标注出来了,激活是获取一次,失去焦点是获取一次
xiangding 2009-08-26
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 tttyd 的回复:]
这样子就比较解释了。
前面两个消息动作是记事本窗口被激活 WM_ACTIVATE fActive:WA_ACTIVE fMinimized:False hwndPrevious:(null)
后两个消息动作是记事本失去焦点WM_ACTIVATE fActive:WA_INACTIVEfMinimized:False hwndPrevious:(null)
[/Quote]

为什么会有两个激活的消息呢, 按理只要一个就行了,
雪影 2009-08-26
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 xiangding 的回复:]
引用 10 楼 tttyd 的回复:
引用 8 楼 xiangding 的回复:
引用 6 楼 tttyd 的回复:
这样子就比较解释了。
前面两个消息动作是记事本窗口被激活 WM_ACTIVATE fActive:WA_ACTIVE fMinimized:False hwndPrevious:(null)
后两个消息动作是记事本失去焦点WM_ACTIVATE fActive:WA_INACTIVEfMinimized:False hwndPrevious:(null)


为什么会有两个激活的消息呢, 按理只要一个就行了,

见5#,我在上面都标注出来了,激活是获取一次,失去焦点是获取一次


上面一共打印了4次WM_ACTIVATE 消息,
如果说激活打印一次,失去焦点打印一次,应该只打印两次才对呀,
[/Quote]
发送接收WM_ACTIVE消息各两次.
xiangding 2009-08-26
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 tttyd 的回复:]
引用 8 楼 xiangding 的回复:
引用 6 楼 tttyd 的回复:
这样子就比较解释了。
前面两个消息动作是记事本窗口被激活 WM_ACTIVATE fActive:WA_ACTIVE fMinimized:False hwndPrevious:(null)
后两个消息动作是记事本失去焦点WM_ACTIVATE fActive:WA_INACTIVEfMinimized:False hwndPrevious:(null)


为什么会有两个激活的消息呢, 按理只要一个就行了,

见5#,我在上面都标注出来了,激活是获取一次,失去焦点是获取一次
[/Quote]

上面一共打印了4次WM_ACTIVATE 消息,
如果说激活打印一次,失去焦点打印一次,应该只打印两次才对呀,
ccpaishi 2009-08-25
  • 打赏
  • 举报
回复
任何一个事件首先都要激活,激活之后才会有这么多的消息。
雪影 2009-08-25
  • 打赏
  • 举报
回复
这样子就比较解释了。
前面两个消息动作是记事本窗口被激活 WM_ACTIVATE fActive:WA_ACTIVE fMinimized:False hwndPrevious:(null)
后两个消息动作是记事本失去焦点 WM_ACTIVATE fActive:WA_INACTIVE fMinimized:False hwndPrevious:(null)
雪影 2009-08-25
  • 打赏
  • 举报
回复
这样子就比较解释了。
前面两个消息动作是记事本窗口被激活
后两个消息动作是记事本失去焦点
雪影 2009-08-25
  • 打赏
  • 举报
回复
我刚做了一下测试,我的机器上是四个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
xylicon 2009-08-25
  • 打赏
  • 举报
回复
00040C5C S WM_ACTIVATE fActive:WA_ACTIVE fMinimized:False hwndPrevious:(null)
其中S代表发送,发送给原来Active的窗口。

00040C5C R WM_ACTIVATE
其中的R代表是记事本收到了该消息。现在Active的窗口是记事本。





xiangding 2009-08-25
  • 打赏
  • 举报
回复
楼上的兄弟能解释清楚一点吗?
太多消息了,

我只监控的"记事本"的消息, 任务栏的激活消息不应该在这里面出现才对
MoXiaoRab 2009-08-25
  • 打赏
  • 举报
回复
这个时候,系统做了几个事情,首先你的记事本激活了,一次,任务栏激活了,一次,本来的顶层窗口失焦了,又激活一次

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧