如何使用 SendMessage 向 hwnd 传递 WM_COMMAND?
How to use SendMessage pass a WM_COMMAND with hwnd?
我在 Spy++ 的按钮事件中得到了一个 WM_COMMAND,它看起来像:
<000116> 001B0A02 S WM_NOTIFY idCtrl:133978 pnmh:0019F9A0
<000117> 001B0A02 R WM_NOTIFY
<000118> 001B0A02 S WM_COMMAND wNotifyCode:0000 wID:2 hwndCtl:00020B5A
<000119> 001B0A02 R WM_COMMAND
<000120> 001B0A02 S WM_NOTIFY idCtrl:133978 pnmh:0019F9BC
<000121> 001B0A02 R WM_NOTIFY
然后我尝试通过 SendMessage
重做 WM_COMMAND
:
什么都没发生。我使用 AHK 脚本来确定,结果相同。
当我使用 SendMessage()
时,Spy++ 得到了这个:
<000423> 001B0A02 S WM_COMMAND wNotifyCode:0000 wID:2 hwndCtl:00000014
<000424> 001B0A02 R WM_COMMAND
我也让 lParam = 0
,然后它起作用了,但不像我预期的那样,打开了另一个菜单项。
<000001> 001B0A02 S WM_COMMAND wNotifyCode:0 (sent from a menu) wID:2
那我该怎么做呢?
要为按钮点击模拟 WM_COMMAND
,您需要将按钮的 ID 和 BN_CLICKED
通知代码(组合)作为 wParam
参数发送给 SendMessage()
,按钮的句柄 (HWND
) 作为 lParam
.
如果 hDlg
是您的对话框句柄 window,并且 IDC_MYBUTTON
是您按钮的资源 ID,则调用将如下所示:
SendMessage(hDlg, WM_COMMAND, MAKEWPARAM(IDC_MYBUTTON, BN_CLICKED), (LPARAM)GetDlgItem(hDlg, IDC_MYBUTTON));
碰巧,BN_CLICKED
通知代码的值为 0
,因此 wParam
值将只是控件 ID;在您的情况下,这似乎是 2
– Windows 用于“取消”按钮的值。在您的代码中,问题似乎是 lParam
参数的无效 window 句柄。
我在 Spy++ 的按钮事件中得到了一个 WM_COMMAND,它看起来像:
<000116> 001B0A02 S WM_NOTIFY idCtrl:133978 pnmh:0019F9A0
<000117> 001B0A02 R WM_NOTIFY
<000118> 001B0A02 S WM_COMMAND wNotifyCode:0000 wID:2 hwndCtl:00020B5A
<000119> 001B0A02 R WM_COMMAND
<000120> 001B0A02 S WM_NOTIFY idCtrl:133978 pnmh:0019F9BC
<000121> 001B0A02 R WM_NOTIFY
然后我尝试通过 SendMessage
重做 WM_COMMAND
:
什么都没发生。我使用 AHK 脚本来确定,结果相同。
当我使用 SendMessage()
时,Spy++ 得到了这个:
<000423> 001B0A02 S WM_COMMAND wNotifyCode:0000 wID:2 hwndCtl:00000014
<000424> 001B0A02 R WM_COMMAND
我也让 lParam = 0
,然后它起作用了,但不像我预期的那样,打开了另一个菜单项。
<000001> 001B0A02 S WM_COMMAND wNotifyCode:0 (sent from a menu) wID:2
那我该怎么做呢?
要为按钮点击模拟 WM_COMMAND
,您需要将按钮的 ID 和 BN_CLICKED
通知代码(组合)作为 wParam
参数发送给 SendMessage()
,按钮的句柄 (HWND
) 作为 lParam
.
如果 hDlg
是您的对话框句柄 window,并且 IDC_MYBUTTON
是您按钮的资源 ID,则调用将如下所示:
SendMessage(hDlg, WM_COMMAND, MAKEWPARAM(IDC_MYBUTTON, BN_CLICKED), (LPARAM)GetDlgItem(hDlg, IDC_MYBUTTON));
碰巧,BN_CLICKED
通知代码的值为 0
,因此 wParam
值将只是控件 ID;在您的情况下,这似乎是 2
– Windows 用于“取消”按钮的值。在您的代码中,问题似乎是 lParam
参数的无效 window 句柄。