给定按钮窗口的手柄,如何模拟按钮单击?

时间:2013-04-30 08:44:33

标签: c++ winapi button

我想模拟点击对话框中的按钮。

我有那个窗口的句柄。这是一个中止/重试/忽略窗口。

我不想模拟具有X和Y坐标的点击,因为它不符合我的需要。

5 个答案:

答案 0 :(得分:14)

向按钮的HWND发送BM_CLICK消息:

SendMessage(hButton, BM_CLICK, 0, 0);

这会导致按钮收到WM_LBUTTONDOWNWM_LBUTTONUP条消息,并且父级会收到BN_CLICKED通知,就像用户实际点击按钮一样。

答案 1 :(得分:9)

找到要点击的按钮的句柄(使用FindWindowEx),然后发送点击消息:

SendMessage(hButton, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(0, 0));
SendMessage(hButton, WM_LBUTTONUP, MK_LBUTTON, MAKELPARAM(0, 0));

答案 2 :(得分:5)

SendMessage(hParent, WM_COMMAND, MAKEWPARAM(IdOfButton, BN_CLICKED), (LPARAM)hwndOfButton);

通常,如果你不知道,你可以在没有hwndOfButton的情况下离开 - 取决于对话框的实现!

可以是SendMessagePostMessage,具体取决于您的使用案例。

答案 3 :(得分:3)

试试这个OK:

SendMessage(hWnd, WM_COMMAND, 1, NULL);

答案 4 :(得分:1)

这是一个完整的功能:

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));
}