2010-10-23 24 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; 
相关问题