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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM