编程方式按一个按钮在另一个应用程序(C Windows)
题
我想用下面的代码按一个按钮我的其他应用程序:
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和上面的代码中,但什么都没有。
任何想法,如何按一下按钮在另一个应用程序的窗口?
代码表示赞赏。谢谢。
编辑:原因似乎不到工作的权限。我送一个问题()及其结果是一个错误。()=5(或访问被拒绝的).任何想法?
EDIT2 我不是故意要这么粗鲁但请,我已经找遍了所有的API包括获取和设置区域的按钮然后发送键并按钮,让控制标识,获取这类标识和无数更多。原因我要求这里的问题中首先是因为我已经用尽了我的搜索互联网上。如果你知道答案 请邮政编码, ,不要提出一个API,就是这样,告诉我怎么API解决问题。这并不难。谢谢你。
编辑3:这个问题的回答是自动选择当的赏金完成。问题仍然没有答案。
解决方案
- 您确定“SaveButton”类名有效吗?您有按钮手柄吗?
- 尝试将消息发送到 ButtonHandle 窗口(直接发送到按钮)。
更新: 我相信这应该有效,
SendMessage(ButtonHandle, BM_CLICK, 0, 0);
其他提示
SendMessage(btnHandle, WM_LBUTTONDOWN, 0, 0);
SendMessage(btnHandle, WM_LBUTTONUP, 0, 0);
SendMessage(btnHandle, WM_LBUTTONDOWN, 0, 0);
SendMessage(btnHandle, WM_LBUTTONUP, 0, 0);
您需要发送一个按钮点击两次。不知道为什么(也许是第一次点击只激活按钮的窗口),但我使用此代码很长一段时间,它总是为我工作。
请参阅下面的溶液,也可以使用
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);
}
}
}
注意: 得到肯定从窗口文本,按钮文本(检查是否存在在窗口标题的端部空间)
接入上的SendMessage或PostMessage的被拒绝的错误没有任何意义。
这不应该发生,除非拥有该目标窗口的过程中正在运行“asAdministrator”或是一个服务。而其该死的努力为服务创造交互式桌面上的窗口与Windows 6或以上。
可以,如果他们做一些阅读完整性等级这里甚至远程应用到这种情况。的Internet Explorer是关于仅其他应用,通过故意降低其自身的完整性水平,以沙箱“中选择采用”到完整性的安全模型本身更有效。
如果可以提高含有该按钮的窗口中,可以生鼠标事件发送到按钮的边界内的位置。
有两种功能来模拟鼠标事件 SendInput 和 mouse_event
。我建议使用mouse_event
功能。为了提高您可以使用的ShowWindow 的一个窗口。我不知道如何让一个按钮的手柄,但如果你有它的hWnd它很容易找到利用其绝对位置的 GetWindowRect 功能。尝试使用这些,如果您遇到任何问题,我会很乐意提供帮助。
或定义你的应用程序中的定制WM的窗口的处理保存请求。 WM_CUSTOM
或WM_USER
(不能记住哪)标记用户定义的窗口消息的开始。
当我必须做这种事情我使用调.这是VB ish和C#提供了一个很好的接口的使用,但为C/C++你必须这样做 <这种方式>.什么是好的是你可以写脚本和运行,而不是他们的辛勤编码的,它在你的代码。
微软现在正在推动 主动辅助功能 (MSAA) 对于UI自动化,(多年来已重命名多次)请参阅
抱歉,我没有任何简单的代码可以帮助您入门。由于“SendMessage()”似乎不适合你,我不知道除了“UI Automation”之外还有其他选择
我假设您已使用 Spy++(与 MsDev 一起安装)检查您的消息是否已发送到正确的按钮等 - 并且该按钮是标准的 Windows 按钮。我的第一个瞬间会说使用“SendMessage()”或“PostMessage()”,但考虑到有关“SendMessage()”的答案数量以及它不适合您的事实。我预计有人正在发生……
可以使用的SendKeys(作为TR3所述)发送鼠标点击,这比使用的SendMessage不同。这也是不太直接和更劈肥胖型,但是可用于自动化(在VBS)。
另外,只是一种猜测,但问题可能是你的邮件处理由不调用基类成员某处破裂。例如:
void CMyClass::OnMessageY(CWnd *cwnd)
{
CBaseClass::OnMessageY(cwnd);
//... my code
}
如果你确定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);
}
一个非C的方法:使用Java语言和java.awt.Robot中的类来移动鼠标进行实时点击(我想有一些是在Windows世界这个,太)。 问题:你必须知道你的按钮:d