title: MFC-模拟鼠标键盘操作
author: Love02xp
date: 2020-08-09 13:04:17
category: [编程代码]
tags: [VC6,代码,学习]
MFC-模拟鼠标键盘操作
@TOC
_
正文
方法一:用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
_
- 原文链接
- 注:知识搬运,供学习交流使用,侵联删!
_