如何用应用程序模拟键盘和鼠标按键
本文示例代碼
模擬鍵盤我們用Keybd_event這個api函數(shù),模擬鼠標(biāo)按鍵用mouse_event函數(shù)。在vc里調(diào)用api函數(shù)是既簡單又方便不過的事了。
首先介紹一下Keybd_event函數(shù)。Keybd_event能觸發(fā)一個按鍵事件,也就是說回產(chǎn)生一個WM_KEYDOWN或WM_KEYUP消息。當(dāng)然也可以用產(chǎn)生這兩個消息來模擬按鍵,但是沒有直接用這個函數(shù)方便。Keybd_event共有四個參數(shù),第一個為按鍵的虛擬鍵值,如回車鍵為vk_return, tab鍵為vk_tab。第二個參數(shù)為掃描碼,一般不用設(shè)置,用0代替就行第三個參數(shù)為選項(xiàng)標(biāo)志,如果為keydown則置0即可,如果為keyup則設(shè)成“KEYEVENTF_KEYUP”,第四個參數(shù)一般也是置0即可。用如下代碼即可實(shí)現(xiàn)模擬按下鍵,其中的XX表示XX鍵的虛擬鍵值,在這里也就是各鍵對應(yīng)的鍵碼,如''A''=65
keybd_event(65,0,0,0);
keybd_event(65,0,KEYEVENTF_KEYUP,0); ...
mouse_event最好配合SetCursorPos(x,y)函數(shù)一起使用,與Keybd_event類似,mouse_event有五個參數(shù),第一個為選項(xiàng)標(biāo)志,為MOUSEEVENTF_LEFTDOWN時(shí)表示左鍵按下為MOUSEEVENTF_LEFTUP表示左鍵松開,向系統(tǒng)發(fā)送相應(yīng)消息。第二三個參數(shù)分別表示x,y
相對位置,一般可設(shè)為0,0,第四五個參數(shù)并不重要,一般也可設(shè)為0,0。若要得到Keybd_event和mouse_event函數(shù)的更詳細(xì)的用法,可以查閱msdn或delphi幫助。
下面是關(guān)于mouse_event的示例代碼:
POINT lpPoint;
GetCursorPos(&lpPoint);
SetCursorPos(lpPoint.x, lpPoint.y);
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
上面的代碼表示鼠標(biāo)的雙擊,若要表示單擊,用兩個mouse_event即可(一次放下,一次松開)。
注意,不管是模擬鍵盤還是鼠標(biāo)事件,都要注意還原,即按完鍵要松開,一個keydown對應(yīng)一個keyup;鼠標(biāo)單擊完也要松開, 不然可能影響程序的功能。
好了,希望本文能讓你對模擬鍵盤和鼠標(biāo)按鍵有個初步的了解,如果想更深入的了解可以查閱msdn在線幫助,并多多動手實(shí)踐,也許會對你有很大的幫助。
玩轉(zhuǎn)keybd_event
????? DELPHI 2005-8-24 15:51
模擬鍵盤平時(shí)不是很常用, 但是當(dāng)調(diào)用某些快捷鍵執(zhí)行某項(xiàng)功能時(shí), 它真的是那么的方便呀. 你不信? 看看下面的實(shí)現(xiàn), 你就會大呼: 為什么不早點(diǎn)告訴我? 呵呵, 原來沒有blog呀, 都靠這些掙分呢.
1) 顯示桌面:
很多軟件有顯示桌面的功能, 并且大家的方法都是遍歷窗口, 然后讓它們最小化, 其實(shí) win系統(tǒng)給咱們了一個非常方便的WIN鍵(就是鍵盤上在CTRL鍵和ALT鍵之間的那個帶win標(biāo)志的按鍵), 利用它, 可以輕松的完成顯示桌面的功能.
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);
其他的操作也類似, 比如直接顯示開始的運(yùn)行,就把上面的'M'換成'R'即可。
直接 keybd_event(VK_LWIN, 0, 0 ,0);
keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP,0);
直接顯示“開始”對話框了。
2) 實(shí)現(xiàn)快速的全選
很多的時(shí)候,比如listctrl實(shí)現(xiàn)全選,你可以用listctrl循環(huán)設(shè)置每一項(xiàng)的狀態(tài)為選中,多羅索的事情呀。用快捷鍵試一試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);
3) 執(zhí)行某些特殊的鍵,比如數(shù)字鍵,大小寫,下面是數(shù)字鍵的例子
bool bState=true; //true為按下NumLock,false反之
BYTE keyState[256];
GetKeyboardState((LPBYTE)&keyState);
if( (bState && !(keyState[VK_NUMLOCK] & 1)) ||
(!bState && (keyState[VK_NUMLOCK] & 1)) )
{
// Simulate a key press
keybd_event( VK_NUMLOCK,
0x45,
KEYEVENTF_EXTENDEDKEY | 0,
0 );
// Simulate a key release
keybd_event( VK_NUMLOCK,
0x45,
KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,
0);
}
4) 你想CTRL+ALT+DELETE三鍵一起按下,
keybd_event(VK_CONTROL, 0, 0 ,0);
keybd_event(VK_MENU,0, 0 ,0);
keybd_event(VK_DELETE,0, 0 ,0);
keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP ,0);
keybd_event(VK_MENU,0, KEYEVENTF_KEYUP ,0);
keybd_event(VK_DELETE,0, KEYEVENTF_KEYUP ,0);
呵呵,這樣不會成功呀,因?yàn)檫@幾個鍵直接是操作系統(tǒng)來截獲執(zhí)行的,而模擬鍵盤只能發(fā)向應(yīng)用程序,所以這種方法不行的(想顯示鎖定對話框,用 LockWorkStation();)
5) Window2000/NT/XP已經(jīng)不提倡用這個函數(shù)了,上面的方法只是為了讓大家開闊一下思路,怎么替代呢,呵呵,看下面,所以上面的所有代碼都可以用這個來完成
//2000下用這個代替 ,包含 "winable.h"
INPUT input[4];
memset(input, 0, sizeof(input));
input[0].type = input[1].type = input[2].type = input[3].type = INPUT_KEYBOARD;
input[0].ki.wVk = input[3].ki.wVk = VK_LWIN;
input[1].ki.wVk = input[2].ki.wVk = 'R';
//接下來釋放它,這一點(diǎn)很重要。
input[2].ki.dwFlags = input[3].ki.dwFlags = KEYEVENTF_KEYUP;
input[0].ki.time = input[1].ki.time = input[2].ki.time = input[3].ki.time = GetTickCount();
SendInput(4, input, sizeof(INPUT));
感覺比那個有點(diǎn)羅索,呵呵。
====================
附WIN鍵的部分快捷鍵:
WIN鍵+D=快速的切到桌面,再次點(diǎn)擊返回
WIN鍵+E=快速打開資源管理器
WIN鍵+R=“運(yùn)行”。
WIN鍵+M=全部視窗最小化。
WIN鍵+Shift+M=取消全部視窗最小化。
WIN鍵+F1=Help。
WIN鍵+F=“尋找”。
WIN鍵+Ctrl+F=顯示“查找電腦”。
WIN鍵+Tab=切換工作列的程式。
WIN鍵+Break=顯示系統(tǒng)內(nèi)容。
?
?
鍵盤鍵與虛擬鍵碼對照表
字母和數(shù)字鍵 數(shù)字小鍵盤的鍵 功能鍵 其它鍵
鍵 鍵碼 鍵 鍵碼 鍵 鍵碼 鍵 鍵碼
A 65 0 96 F1 112 Backspace 8
B 66 1 97 F2 113 Tab 9
C 67 2 98 F3 114 Clear 12
D 68 3 99 F4 115 Enter 13
E 69 4 100 F5 116 Shift 16
F 70 5 101 F6 117 Control 17
G 71 6 102 F7 118 Alt 18
H 72 7 103 F8 119 Caps Lock 20
I 73 8 104 F9 120 Esc 27
J 74 9 105 F10 121 Spacebar 32
K 75 * 106 F11 122 Page Up 33
L 76 + 107 F12 123 Page Down 34
M 77 Enter 108 -- -- End 35
N 78 - 109 -- -- Home 36
O 79 . 110 -- -- Left Arrow 37
P 80 / 111 -- -- Up Arrow 38
Q 81 -- -- -- -- Right Arrow 39
R 82 -- -- -- -- Down Arrow 40
S 83 -- -- -- -- Insert 45
T 84 -- -- -- -- Delete 46
U 85 -- -- -- -- Help 47
V 86 -- -- -- -- Num Lock 144
W 87
X 88
Y 89
Z 90
0 48
1 49
2 50
3 51
4 52
5 53
6 54
7 55
8 56
9 57
總結(jié)
以上是生活随笔為你收集整理的如何用应用程序模拟键盘和鼠标按键的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 8.16~8.27.BZoi集训总结
- 下一篇: java中带参数的try(){}语法含义