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