我想模拟单击位于对话框中的按钮。
我有那个窗口的把手。这是一个中止/重试/忽略类型的窗口。
我不想模拟具有 X 和 Y 坐标的点击,因为它不适合我的需要。
BM_CLICK
向按钮的 HWND发送消息:
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));
SendMessage(hParent, WM_COMMAND, MAKEWPARAM(IdOfButton, BN_CLICKED), (LPARAM)hwndOfButton);
通常,如果您不知道,您可以在没有 的情况下逃脱hwndOfButton
- 取决于对话框的实现!
它可以是SendMessage
或PostMessage
,具体取决于您的用例。
试试这个就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));
}