MFC模拟点击其他程序的模态消息提示框的“确定”按钮

来源:互联网 发布:js 大数 错误 编辑:程序博客网 时间:2024/04/28 12:54

最近在尝试操作如何使用自己的程序来模拟操作其他程序,大体步骤就是把界面拆分开,获取句柄从而达到操作其他程序的目的,但是遇到一个问题就是当其他程序弹出一个消息提示框时,无法获取到它的句柄,所以程序进行到这里就无法执行下去了,例如点击注册信息界面上的“提交”按钮,程序会弹框提示“确认提交注册信息吗?”。找到了问题的原因和解决办法,如下:

注:为了方便区分,把别人的程序称为程序A,自己写的程序称为程序B

首先,点击“提交”按钮的操作不能使用SendMessage,要使用PostMessage,它俩有个最大的区别就是SendMessage是阻塞的,也就是说,当程序ASendMessage之后,程序A的提示框必须点击“确认”或者“取消"或者"关闭“之后,你自己的程序B才能继续运行,而当程序APostMessage之后,程序B可以继续该干嘛干嘛,所以如果想用程序B来继续操作程序A必须使用PostMessage。之后,无法获取到消息框的句柄,所以采用的方法是EnumWindows,也就是列出桌面上所有的窗口,把父窗口为A程序的窗口全部找到,里面肯定有你需要的那个消息提示框,代码如下:

::PostMessage(hTest, WM_LBUTTONDOWN, 0, 0);  //hTest是你获取到的“提交”按钮的句柄::PostMessage(hTest, WM_LBUTTONUP, 0, 0);Sleep(500);  //睡500毫秒,等待你的程序弹出消息提示框EnumWindows(EnumWindowsProc, NULL);BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam){    HWND topWindow = ::FindWindow(NULL, _T("聊天程序3.0"));    if(GetParent(hWnd) == topWindow && IsWindowVisible(hWnd))//判断是否为顶层窗口并且可见        {            const int BTN_SUBMIT = 0x000006;//0x000006是消息提示框上“确认”按钮的句柄,可以用spy++获取到            HWND message = hWnd;            if(message == 0)                {                    return false;                }                HWND submi = ::GetDlgItem(message,BTN_SUBMIT);                ::SendMessage(submit, WM_LBUTTONDOWN, 0, 0);                ::SendMessage(submit, WM_LBUTTONUP, 0, 0);         }         return true;}
这样就可以了。

0 0