2010-10-23 21 views
-2

我想通過鍵盤改變輸入的鍵。如何通過C#中的應用程序之外的鍵盤更改輸入的鍵?

我設法限制鍵盤輸入的鍵。

代碼在C#:

using System.Runtime.InteropServices; 

    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
      SetWindowsHookEx(WH_KEYBOARD_LL, hookProc, LoadLibrary("User32"), 0); 
      HookedKeys.Add(Keys.A); 
      HookedKeys.Add(Keys.B); 
     } 

     [DllImport("user32.dll")] 
     static extern IntPtr SetWindowsHookEx(int idHook, keyboardHookProc callback, IntPtr hInstance, uint threadId); 

     [DllImport("kernel32.dll")] 
     static extern IntPtr LoadLibrary(string lpFileName); 

     const int WH_KEYBOARD_LL = 13; 
     const int WM_KEYDOWN = 0x100; 

     public List<Keys> HookedKeys = new List<Keys>(); 

     public delegate int keyboardHookProc(int code, int wParam, ref keyboardHookStruct lParam); 
     public struct keyboardHookStruct 
     { 
      public int vkCode; 
     } 

     public int hookProc(int code, int wParam, ref keyboardHookStruct lParam) 
     { 
      Keys key = (Keys)lParam.vkCode; 
      if (HookedKeys.Contains(key)) 
       return 1; 
      else 
       return 0; 
     } 

    } 

窗口.... 記事本上調試支票或其他地方後,A和B鍵將無法正常工作

我如何修改鍵,取代'A'其他一些關鍵?

+4

請詳細說明你越試圖完成 – yonan2236 2010-10-23 07:16:49

+2

什麼也許你可以提供你已經嘗試了代碼並讓我們知道您面臨的問題 – InSane 2010-10-23 07:19:34

回答

2

由於struct通過ref傳遞,所以可以修改它的內容並且它可以工作。

而你的代碼也不處理syskeys。而當您修改密鑰時,則需要注意,因爲某些應用程序使用虛擬密鑰代碼,而其他應用程序使用掃描代碼來確定它是哪個密鑰。所以你應該修改兩個。

但是你的代碼被破壞了,因爲你沒有調用下一個鉤子(使用CallNextHookEx)。所以你要禁用除你以外的所有鉤子,這是不好的

這個我PASCAL代碼(這是一個快速破解,所以這是一個有點難看):

function LowLevelKeyBoardProc(nCode: Integer; awParam: WPARAM; alParam: LPARAM): LRESULT; stdcall; 
var 
    fEatKeyStroke: Boolean; 
    replace:bool; 
    replacement:TReplacement; 
    p: PKBDLLHOOKSTRUCT; 
    I: Integer; 
    flags:Cardinal; 
    fProcessID:Cardinal; 
    active:boolean; 
begin 
    fEatKeystroke := False; 
    flags:=0; 
    replace:=false; 
    if active and ( nCode = HC_ACTION) then 
    begin 
     p := PKBDLLHOOKSTRUCT(alParam); 
     case awParam of 
      WM_KEYDOWN, 
      WM_SYSKEYDOWN, 
      WM_KEYUP, 
      WM_SYSKEYUP: 
       begin 
        for I := 0 to length(Replacements) - 1 do 
        if Replacements[i].oldKey=p^.vkCode 
         then begin 
         replacement:=Replacements[i]; 
         replace:=true; 
         end; 
       end; 
     end; 
    end; 
    if replace 
     then begin 
     if (awParam=WM_KEYUP)or(awParam=WM_SYSKEYUP)then 
      flags:=flags or KEYEVENTF_KEYUP; 
     keybd_event(p^.vkCode, replacement.newScan, flags ,0); 
     //keybd_event(replacement.newKey, replacement.newScan, flags,0); 
     fEatKeystroke:=true; 
     end; 
    if fEatKeyStroke then 
     Result := 1 
    else 
     Result := CallNextHookEx(hhkLowLevelKybd, nCode, awParam, alParam); 
end; 
相關問題