如何使用 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 句柄。