zoukankan      html  css  js  c++  java
  • 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();
  • 相关阅读:
    新年初六
    新年初五
    新年初四
    Who moved my cheese?
    红螺寺踏春
    JSP基本语法--实例演练
    JSP基础语法--跳转指令 jsp:forward page
    JSP基本语法--包含指令<%@include file="路径"%> <jsp:include page>
    JSP基本语法--Page指令 <%@page 属性=”内容“%>
    JSP注释及scriptlet <%局部%><%!全局%><%=输出%>
  • 原文地址:https://www.cnblogs.com/kongbursi-2292702937/p/15103348.html
Copyright © 2011-2022 走看看