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();

 

posted @ 2021-08-05 14:55  kongbursi  阅读(1260)  评论(0编辑  收藏  举报