如何在已知按钮窗口句柄的情况下模拟点击按钮?

14
我想模拟在对话框中点击按钮。
我有该窗口的句柄。这是一种“中止/重试/忽略”的窗口。
我不想通过模拟具有X和Y坐标的单击来实现,因为它不适合我的需求。

这个有帮助吗?http://forums.codeguru.com/showthread.php?377394-Windows-SDK-User-Interface-How-can-I-emulate-mouse-events-in-an-application - Friedrich
这不是正常的。似乎断言失败了,而且你正在运行调试版本。尝试使用_set_abort_behavior()函数。 - Dmitry Sazonov
5个回答

19

向按钮的 HWND 发送 BM_CLICK 消息:

SendMessage(hButton, BM_CLICK, 0, 0);

这会导致按钮接收WM_LBUTTONDOWNWM_LBUTTONUP消息,父窗口接收一个BN_CLICKED通知,就好像用户实际点击了该按钮一样。


13

通过使用FindWindowEx找到您想要点击的按钮的句柄,然后发送单击消息:

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

它能工作,但不是一种优雅的解决方案。WinAPI不支持直接“点击”窗口按钮的功能吗?我不得不使用Spy++来获取按钮的名称,这并不是一件直截了当的事情。 - AB.
@AronBoguta 你可以使用EnumChildWindows列举所有窗口,直到找到目标按钮的句柄。如果WinAPI包含一个可以直接“点击”窗口按钮的函数,它将完全执行我们所做的操作。此外,WinAPI将按钮视为(子)窗口。 - Nemanja Boric
谢谢,我已经知道EnumChildWindows了,但我希望从WinAPI中得到更多的东西 :) - AB.
8
使用单个BM_CLICK消息而不是两个WM_LBUTTON...消息:SendMessage(hButton, BM_CLICK, 0, 0); - Remy Lebeau

12
SendMessage(hParent, WM_COMMAND, MAKEWPARAM(IdOfButton, BN_CLICKED), (LPARAM)hwndOfButton);
通常情况下,如果您不知道它,那么您可以不必使用hwndOfButton - 这取决于对话框的实现!根据您的用例,它可以是SendMessagePostMessage

尝试了所有其他答案,这个是唯一一个对我有效的。 - barak manos
你应该意识到在 WinUser.h 中,BN_CLICKED 被定义为 #define BN_CLICKED 0,因此在这里使用 MAKEWPARAM 是多余的。除非你试图在代码中进行文档记录,否则 WPARAM(idOfButton) 就足够处理由鼠标点击引起的 WM_COMMAND 了。 - Michael Goldshteyn
2
当然可以,但如果您使用#define,则意图非常清晰-这是更好的实践,代码更清晰,更容易编辑(到不同的代码)。虽然感谢您指出这一点 :) - noelicus
这对我也起作用了:SendMessage(WM_COMMAND, MAKEWPARAM(IDC_BUTTON_MODIFY_TALK, BN_CLICKED), (LPARAM)m_btnModify.GetSafeHwnd()); - Andrew Truckle

3

尝试这个方法来解决OK的问题:

SendMessage(hWnd, WM_COMMAND, 1, NULL);

没有“确定”按钮,就像我说的那样,只有“中止/重试/忽略”,我希望点击“中止”。 - AB.

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

尽管这并没有回答原始问题,但它对我寻找的东西有所帮助,谢谢! - George Dimitriadis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接