我想模拟在对话框中点击按钮。
我有该窗口的句柄。这是一种“中止/重试/忽略”的窗口。
我不想通过模拟具有X和Y坐标的单击来实现,因为它不适合我的需求。
我有该窗口的句柄。这是一种“中止/重试/忽略”的窗口。
我不想通过模拟具有X和Y坐标的单击来实现,因为它不适合我的需求。
向按钮的 HWND 发送 BM_CLICK
消息:
SendMessage(hButton, BM_CLICK, 0, 0);
这会导致按钮接收WM_LBUTTONDOWN
和WM_LBUTTONUP
消息,父窗口接收一个BN_CLICKED
通知,就好像用户实际点击了该按钮一样。
通过使用FindWindowEx
找到您想要点击的按钮的句柄,然后发送单击消息:
SendMessage(hButton, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(0, 0));
SendMessage(hButton, WM_LBUTTONUP, MK_LBUTTON, MAKELPARAM(0, 0));
EnumChildWindows
列举所有窗口,直到找到目标按钮的句柄。如果WinAPI包含一个可以直接“点击”窗口按钮的函数,它将完全执行我们所做的操作。此外,WinAPI将按钮视为(子)窗口。 - Nemanja BoricBM_CLICK
消息而不是两个WM_LBUTTON...
消息:SendMessage(hButton, BM_CLICK, 0, 0);
- Remy LebeauSendMessage(hParent, WM_COMMAND, MAKEWPARAM(IdOfButton, BN_CLICKED), (LPARAM)hwndOfButton);
通常情况下,如果您不知道它,那么您可以不必使用hwndOfButton
- 这取决于对话框的实现!根据您的用例,它可以是SendMessage
或PostMessage
。WinUser.h
中,BN_CLICKED
被定义为 #define BN_CLICKED 0
,因此在这里使用 MAKEWPARAM
是多余的。除非你试图在代码中进行文档记录,否则 WPARAM(idOfButton)
就足够处理由鼠标点击引起的 WM_COMMAND
了。 - Michael GoldshteynSendMessage(WM_COMMAND, MAKEWPARAM(IDC_BUTTON_MODIFY_TALK, BN_CLICKED), (LPARAM)m_btnModify.GetSafeHwnd());
- Andrew Truckle尝试这个方法来解决OK的问题:
SendMessage(hWnd, WM_COMMAND, 1, NULL);
void clickControl(HWND hWnd, int x, int y)
{
POINT p;
p.x = x; p.y = y;
ClientToScreen(hWnd, &p);
SetCursorPos(p.x, p.y);
PostMessage(hWnd, WM_MOUSEMOVE, 0, MAKELPARAM(x, y));
PostMessage(hWnd, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(x, y));
PostMessage(hWnd, WM_LBUTTONUP, MK_LBUTTON, MAKELPARAM(x, y));
}