MFC-模拟鼠标键盘操作

方法一:用SendMessage和PostMessage 

看:https://www.cnblogs.com/liming19680104/p/17151427.html

方法二:mouse_event鼠标事件

看:https://www.cnblogs.com/liming19680104/p/17317659.html 

方法三:快捷键和全局热键 

 快捷键:程序窗口处于活动窗口时才有效

全局热键:只要程序启动,任何时候都有效

快捷键方式

这种方法不推荐:在上面两种方法不行时可以使用这种方法(有的软件子控件句柄找不到)

爱奇艺万能播放器为实例

爱奇艺万能播放器下载:

链接:https://pan.baidu.com/s/1yTNF10--kxND2Aq0i9yjWA
提取码:6666

 

复制代码
    //快捷键方式:
    HWND hDlgWnd = ::FindWindow(_T("244BF600-9015-42B0-A566-67F4EF764FB6"), NULL);//获取窗口句柄
    if (hDlgWnd) {
        ::ShowWindow(hDlgWnd, SW_NORMAL);
        ::SetForegroundWindow(hDlgWnd);
        //快捷键只能针对活动窗口,需要把相应的窗口设置为活动窗口
        Sleep(1000);
        keybd_event(VK_BACK, 0, 0, 0);
        //看:https://www.cnblogs.com/liming19680104/p/17126240.html
        Sleep(100);
        keybd_event(VK_BACK, 0, KEYEVENTF_KEYUP, 0);
复制代码

【以上实例对keybd_event好像无效,是不是对某些软件无效,知道的请告诉我,我的电话13116140007  万分感谢】 

下面以记事本为例:

复制代码
    HWND hDlgWnd = ::FindWindow(_T("Notepad"), NULL);//获取窗口句柄
    if (hDlgWnd) {
        ::ShowWindow(hDlgWnd, SW_NORMAL);
        ::SetForegroundWindow(hDlgWnd);
        //快捷键只能针对活动窗口,需要把相应的窗口设置为活动窗口
        //Sleep(500);
        
        /*
        keybd_event(VK_CONTROL, 0, 0, 0);//按下CTRL键
        keybd_event('O', 0, 0, 0);//按下o键
        Sleep(150);
        keybd_event('O', 0, KEYEVENTF_KEYUP, 0);//松开o键
        keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);//松开CTRL键
        */

        keybd_event(VK_F5, 0, 0, 0);//按下F5键
        Sleep(150);
        keybd_event(VK_F5, 0, KEYEVENTF_KEYUP, 0);//松开F5键
复制代码

 

全局热键方式: 

以酷狗音乐为例

 

复制代码
    HWND hDlgWnd = ::FindWindow(_T("kugou_ui"), NULL);//获取窗口句柄
    //全局热键:窗口没必要是活动窗口
    if (hDlgWnd) {
        
        keybd_event(VK_MENU, 0, 0, 0);//按下ALT键
        keybd_event(VK_F5, 0, 0, 0);//按下F5键
        Sleep(100);
        keybd_event(VK_F5, 0, KEYEVENTF_KEYUP, 0);
        keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0);
        
    }
复制代码

实例工程下载:

链接:https://pan.baidu.com/s/1r0n4EQ8jeKaHRxRFkj2bRw
提取码:6666

 

模拟输入文本 

复制代码
#define IsKeyPressed(nVirtKey)  ((GetKeyState(nVirtKey) & (1<<(sizeof(SHORT)*8-1))) != 0)
//看:https://www.cnblogs.com/liming19680104/p/17126461.html 
//IsKeyPressed(nVirtKey)函数返回值为TRUE,则表示按键按下;反之表示按键弹起
#define IsKeyToggled(nVirtKey)  ((GetKeyState(nVirtKey) & 1) != 0)
//IsKeyToggled(nVirtKey)函数返回值为TRUE表示按键处于切换状态,亮灯;返回值为FALSE,表示按键处于非切换状态,灭灯 

void CmonizifusuruDlg::OnBnClickedButton1()
{
    // TODO: 在此添加控件通知处理程序代码
    HWND hNotepad = ::FindWindow(_T("Notepad"), NULL);//获取记事本句柄
    if (!hNotepad) {
        AfxMessageBox(_T("请打开记事本"));
        ExitProcess(0);
    }
    ::ShowWindow(hNotepad, SW_NORMAL);
    ::SetForegroundWindow(hNotepad);//把记事本置为活动窗口

    BOOL bToggled = IsKeyToggled(VK_CAPITAL);
    if (bToggled) {  //如果按键处于切换状态,亮灯【即大写状态】
        keybd_event(VK_CAPITAL, 0,  0, 0);
        Sleep(20);
        keybd_event(VK_CAPITAL, 0,  KEYEVENTF_KEYUP, 0);
    }

    CString strOut(_T("AbCd"));
    for (int idx = 0; idx < strOut.GetLength(); idx++)
    {
        TCHAR ch = strOut.GetAt(idx);
        if (_istlower(ch)) {        //如果是小写
            keybd_event(_totupper(ch), 0, 0, 0);
            /*
            说明:keybd_event参数1的虚拟键吗必须是大写
            实际输入是小写【caps lock处于小写状态】
            */
            Sleep(20);
            keybd_event(_totupper(ch), 0, KEYEVENTF_KEYUP, 0);
        }
        else {
            keybd_event(VK_SHIFT, 0, 0, 0);
            keybd_event(ch, 0, 0, 0);
            Sleep(20);
            keybd_event(ch, 0, KEYEVENTF_KEYUP, 0);
            keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
        }
        Sleep(100);
    }

}
复制代码

 

方法四: SendInput 方式-推荐

Windows NT/2000/XP/Vista/7 及以后的操作系统中,微软不建议使用 mouse_event、keybd_event 等模拟鼠标、键盘事件的 API 函数,
建议的方式是使用 SendInput 函数

看:https://www.cnblogs.com/liming19680104/p/17335335.html

 

 

 

 

 

 

 

 

 

posted @   天子骄龙  阅读(675)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2022-04-14 今日头条用电脑开直播
2022-04-14 浩辰CAD-圆弧
2019-04-14 python-文件读写操作
2019-04-14 pyqt5-控件的显示与隐藏
2019-04-14 pyqt5-控件是否可用
点击右上角即可分享
微信分享提示

目录导航