將這個文件編譯成一個dll,即可在應用程序中調用。通過它提供的事件,便可監聽所有的鍵盤事件。
但是,這只能監聽鍵盤事件,沒有鍵盤的情況下,怎麼會有鍵盤事件?其實很簡單,通過SendInput
API函數提供虛擬鍵盤代碼的調用即可模擬鍵盤輸入。下面的代碼模擬一個 KeyDown 和 KeyUp 過程,
把他們連接起來就是一次按鍵過程。
1 private void SendKeyDown(short key) {
2 Input[] input = new Input[1];
3 input[0].type = INPUT.KEYBOARD;
4 input[0].ki.wVk = key;
5 input[0].ki.time = NativeMethods.GetTickCount();
6
7 if (NativeMethods.SendInput((uint)input.Length, input, Marshal.SizeOf(input[0]))
8 < input.Length) {
9 throw new Win32Exception(Marshal.GetLastWin32Error());
10 }
11 }
12
13 private void SendKeyUp(short key) {
14 Input[] input = new Input[1];
15 input[0].type = INPUT.KEYBOARD;
16 input[0].ki.wVk = key;
17 input[0].ki.dwFlags = KeyboardConstaint.KEYEVENTF_KEYUP;
18 input[0].ki.time = NativeMethods.GetTickCount();
19
20 if (NativeMethods.SendInput((uint)input.Length, input, Marshal.SizeOf(input[0]))
21 < input.Length) {
22 throw new Win32Exception(Marshal.GetLastWin32Error());
23 }
24 }
自己實現一個 KeyBoardButton 控件用作按鈕,用 Visual Studio 或者 SharpDevelop 為屏幕鍵盤設計 UI,然後在這些 Button 的 Click 事件裡面模擬一個按鍵過程。
1
2 private void ButtonOnClick(object sender, EventArgs e) {
3 KeyboardButton btnKey = sender as KeyboardButton;
4 if (btnKey == null) {
5 return;
6 }
7
8 SendKeyCommand(btnKey);
9 }
10
11 private void SendKeyCommand(KeyboardButton keyButton) {
12 short key = keyButton.VKCode;
13 if (combinationVKButtonsMap.ContainsKey(key)) {
14 if (keyButton.Checked) {
15 SendKeyUp(key);
16 } else {
17 SendKeyDown(key);
18 }
19 } else {
20 SendKeyDown(key);
21 SendKeyUp(key);
22 }
23 }