程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 用鉤子(hook)實現C#的屏幕鍵盤效果(5)

用鉤子(hook)實現C#的屏幕鍵盤效果(5)

編輯:關於C語言

將這個文件編譯成一個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  }

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved