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

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

注:为了方便区分,把别人的程序称为程序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;
}
这样就可以了。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值