qt程序使用——keybd_event函数的用法和问题 & SetCursorPos & GetCursorPos函数和mouse_event的一些问题
1、GetCursorPos函数
返回值:
如果成功,返回非0;如果失败,返回0。
头文件:WinUser.h(在写程序时#include <Windows.h>就可以使用这个函数了)
POINT pt;
GetCursorPos(&pt);
qDebug() << pt.x << pt.y << endl;
上面的示例就是获得鼠标当前位置,并输出x和y坐标(参考系为桌面)
2、SetCursorPos函数
QPoint p;
SetCursorPos(p.x(), p.y());
上面函数示例是把鼠标移动到p这个点的位置(参考系为桌面)
3、mouse_event的一些问题
我原本是准备用mouse_event来把鼠标移动到桌面上某个位置,但是当我计算好鼠标当前位置和终点位置之间的差值之后,使用mouse_event移动这个差值发现移动的数值比这个要大(一脸懵逼。。。)
QPoint cha;
mouse_event(MOUSEEVENTF_MOVE, cha.x(), cha.y(), 0, 0);
然后我又加上MOUSEEVENTF_ABSOLUTE发现错的更加离谱,我就换成了SetCursorPos函数
4、keybd_event函数
函数原型:
VOID keybd_event(
BYTE bVk, // virtual-key code——定义一个虚拟键码,键码值必须在1~254之间。
BYTE bScan, // hardware scan code——定义该键的硬件扫描码。
DWORD dwFlags, // flags specifying various function options——定义函数操作的各个方面的一个标志位集。应用程序可使用如下一些预定义常数的组合设置标志位:
//1、KEYEVENTF_EXTENDEDKEY:若指定该值,则扫描码前一个值为OXEO(224)的前缀字节。
//2、KEYEVENTF_KEYUP:若指定该值,该键将被释放;若未指定该值,该键将被按下。
DWORD dwExtraInfo // additional data associated with keystroke——定义与击键相关的附加的32位值。
);
第一个为按键的虚拟键值,如回车键为 vk_return, tab 键为 vk_tab(其他具体的参见附录:常用模拟键的键值对照表);
第二个参数为扫描码,一般不用设置,用 0 代替就行;
第三个参数为选项标志,如果为 keydown 则置 0 即可,如果为 keyup 则设成
"KEYEVENTF_KEYUP";
第四个参数一般也是置 0 即可。
示例:
1)、显示桌面
keybd_event(VK_LWIN, 0, 0 ,0); //按下键
keybd_event('M', 0, 0 ,0);
keybd_event('M', 0, KEYEVENTF_KEYUP ,0); //释放键
keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP,0);
2)、Ctrl+A全选
keybd_event(VK_CONTROL, (BYTE)0, 0 ,0);
keybd_event('A',(BYTE)0, 0 ,0); //此处可以用 'A', (BYTE)65, 用'a'不起作用.
keybd_event('A', (BYTE)0, KEYEVENTF_KEYUP,0);
keybd_event(VK_CONTROL, (BYTE)0, KEYEVENTF_KEYUP,0);
更多例子:https://blog.csdn.net/liubing8609/article/details/81974001
5、keybd_event函数的问题
当我准备在按下Ctrl键后做一些事情,然后再松开Ctrl键,但是无法实现。
keybd_event(VK_CONTROL, 0, 0, 0);
//程序——做一些事情
keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
中间的程序就好像和没有按下Ctrl键一样(我中间的程序是按下鼠标左键的同时移动鼠标然后松开鼠标左键,但是就代码执行的情况而言,就好像没有这两行代码一样)
keybd_event(VK_CONTROL, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_MOVE, 0, -80, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
就好像程序提前就知道了Ctrl键按下后会松开,所以直接就松开了,没有按照代码顺序执行
6、可能你会需要捕捉键盘按下事件,所以这里也说一下
void QWidget::keyPressEvent(QKeyEvent *event) //键盘按下事件
void QWidget::keyReleaseEvent(QKeyEvent *event) //键盘松开事件
//示例
void MainForm::keyPressEvent(QKeyEvent *ev)
{
if(ev->key() == Qt::Key_F5)
{
ui->stackedWidget->reloadPage();
return;
}
QWidget::keyPressEvent(ev);
}
void MainForm::keyReleaseEvent(QKeyEvent *ev)
{
if(ev->key() == Qt::Key_F5)
{
ui->stackedWidget->reloadPage();
return;
}
QWidget::keyReleaseEvent(ev);
}
如果你确实按下键位了,但是没有捕捉到可能是没有开启捕捉键盘事件的开关
this->grabKeyboard();