编程按下另一个应用程序的按钮(C,Windows中)(Programmatically press

2019-07-31 07:57发布

我尝试使用下面的代码按我的其他应用程序的按钮:

HWND ButtonHandle;
if( (wnd = FindWindow(0, "Do you want to save?")) )
{   
   ButtonHandle = FindWindowEx(wnd, 0, "SaveButton", "&Save");
   SendMessage(wnd, WM_COMMAND, MAKEWORD(GetDlgCtrlID(ButtonHandle), BN_CLICKED ), (LPARAM)ButtonHandle);

}

它不工作。 我试图通过不同的句柄MAKEWORD和改变WPARM和lParam,但没有。

如何点击另一个应用程序的窗口中的按钮任何想法?

代码是表示赞赏。 谢谢。

编辑:它似乎并没有工作许可的原因。 我发送的PostMessage的(),并且结果与GetLastError函数的误差()= 5(或拒绝访问)。 有任何想法吗?

EDIT2我的意思并不是要粗鲁,但请请请,我已经找遍了所有的API,包括获取和按钮设置区域,然后发送按钮并扣,得到了控制ID,获取类ID和数不胜数了。 我在这里提出的问题摆在首位的原因是因为我已经耗尽了我在互联网上搜索。 如果你知道答案, 请邮编 ,不建议一个API,就是这样,告诉我那怎么API解决了这个问题。 这并不难。 谢谢。

编辑3:当赏金完成的问题的答案自动选择。 问题仍然没有答案。

Answer 1:

  1. 你确定“SaveButton”类名是有效的? 你得到的按钮处理?
  2. 尝试将消息发送到ButtonHandle窗口(直接到按钮)。

更新:我相信这应该工作,

SendMessage(ButtonHandle, BM_CLICK, 0, 0);


Answer 2:

SendMessage(btnHandle, WM_LBUTTONDOWN, 0, 0);
SendMessage(btnHandle, WM_LBUTTONUP, 0, 0);
SendMessage(btnHandle, WM_LBUTTONDOWN, 0, 0);
SendMessage(btnHandle, WM_LBUTTONUP, 0, 0);

你必须发送一个按钮点击两次。 不知道为什么(也许是第一次点击只激活按钮的窗口),但我使用此代码很长一段时间,它总是为我工作。



Answer 3:

也许这可以帮助: http://www.cplusplus.com/forum/beginner/8806/



Answer 4:

请参阅下面的解决方案,也可以使用

SendMessage(ButtonHandle, WM_LBUTTONDOWN, 0, 0);
SendMessage(ButtonHandle, WM_LBUTTONUP, 0, 0);

要么

SendMessage(ButtonHandle, BM_CLICK, 0, 0);

HWND buttonHandle = 0;

BOOL CALLBACK GetButtonHandle(HWND handle, LPARAM)
{
 char label[100];
 int size = GetWindowTextA(handle,label,sizeof(label));
 if(strcmp(label,"&Save") == 0)
 {
  buttonHandle = handle;
  return false;
 }
 return true;
}
void main()
{
 HWND windowHandle = FindWindowA(NULL,"Do you want to Save?");
 if(windowHandle != 0)
 {
  BOOL ret = EnumChildWindows(windowHandle,GetButtonHandle,0);

  if(buttonHandle != 0)
  {
   LRESULT res = SendMessage(buttonHandle,BM_CLICK,0,0);
   //SendMessage(buttonHandle,WM_LBUTTONDOWN,0,0); 
   //SendMessage(buttonHandle,WM_LBUTTONUP,0,0);
  }

 }



}

注:获得肯定,从窗口文本,按钮文本(检查是否在窗口标题末尾有空格)



Answer 5:

除非进程发送消息以比目标进程较低完整性级别上运行的SendMessage或PostMessage的拒绝访问错误是没有意义的。

这不应该发生的,除非拥有该目标窗口的进程正在运行“asAdministrator”或者是一种服务。 而其该死的努力为服务创造交互式桌面上的窗口与Windows 6或以上。

你可以做一些阅读完整性级别在这里 ,如果他们甚至远程应用到这种情况。 互联网浏览器是他们唯一的其他应用程序,通过故意更有效地降低自身的诚信水平,以沙盒本身“在选择采用”以诚信安全模型。



Answer 6:

如果你能提高包含按钮的窗口,你可以生鼠标事件发送到按钮的边界内的位置。

有两个函数来模拟鼠标事件SendInput和mouse_event 。 我建议使用mouse_event功能。 为了提高一个窗口,你可以使用的ShowWindow 。 我不知道如何让一个按钮的手柄,但如果你有它的hWnd它很容易找到利用其绝对位置GetWindowRect功能。 尝试使用这些,如果您遇到任何问题,我会很乐意提供帮助。

或应用程序窗口中定义一个定制的WM处理保存请求。 WM_CUSTOMWM_USER (不能记住哪)标记用户定义的窗口消息的开始。



Answer 7:

当我必须做这类事情我使用的SendKeys。 这是VB-ISH和C#提供了一个很好的接口使用,但对于C / C ++,你必须做< 这样 >。 什么是它美好的是,你可以编写脚本并运行它们,而不是硬在你的代码对其进行编码。



Answer 8:

微软正在推动活动辅助功能(MSAA)的UI自动化(现已更名为历年来多次)见

  • UI自动化和Microsoft Active Accessibility的
  • 使用UI自动化自动化测试
  • UI自动化客户端托管代码

对不起,我没有任何简单的代码,让您开始。 作为“SendMessage函数()”似乎并不为你工作,我不知道其他的选项除了“UI自动化”

我假设你有一个间谍检查++(与MSDEV安装),你的消息正被发送到正确的按钮等 - 以及该按钮是一个标准的Windows按钮。 我的第一个瞬间会说使用“的SendMessage()‘或’PostMessage的()”,但鉴于有关答复的数字‘的SendMessage()’,事实上它不为你工作。 我希望在有人会...



Answer 9:

您可以使用的SendKeys(如TR3说)发送鼠标点击,这比使用SendMessage函数不同。 这也是那么直接,更劈十岁上下,但对于自动化是有用的(在VBS)。

而且,只是一种猜测,但问题可能是你的邮件处理由不调用基类成员某处破裂。 例:

void CMyClass::OnMessageY(CWnd *cwnd)
{
    CBaseClass::OnMessageY(cwnd);
    //... my code
}


Answer 10:

如果你确定ButtonHandle是有效的句柄,您可以使用对WM_LBUTTONDOWN和WM_LBUTTONUP消息,而不是BN_CLICKED

HWND ButtonHandle;
if( (wnd = FindWindow(0, "Do you want to save?")) )
{   
    SendMessage(ButtonHandle, WM_LBUTTONDOWN, MK_LBUTTON, 0);
    SendMessage(ButtonHandle, WM_LBUTTONUP, MK_LBUTTON, 0);
}


Answer 11:

非-C的方法:使用Java语言和java.awt.Robot中的类来移动鼠标进行实时点击(我想有一些是在Windows世界这个,太)。 问题:你必须知道你的按钮:d



文章来源: Programmatically press a button on another application (C, Windows)