2010-10-23 2 views
-2

J'essaye de changer la clé entrée par le clavier.Comment puis-je changer la touche entrée par le clavier en dehors de mon application en C#?

J'ai réussi à restreindre la touche entrée par le clavier.

code en 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; 
     } 

    } 

Après le débogage contrôle sur Bloc-notes ou nulle part ailleurs dans la fenêtre .... A et B clé ne fonctionnera pas

Comment puis-je modifier les clés , à la place de «A» une autre clé?

+4

s'il vous plaît élaborer davantage ce que vous essayez d'accomplir – yonan2236

+2

Peut-être que vous pouvez fournir le code que vous avez essayé et laissez-nous savoir quel problème vous affrontez avec – InSane

Répondre

2

Puisque la structure est passée par ref, vous pouvez modifier son contenu et cela fonctionnera.

Et votre code ne traite pas non plus des syskeys. Et lorsque vous modifiez la clé, vous devez faire attention car certaines applications utilisent le code de clé virtuelle, et d'autres le scancode pour déterminer de quelle clé il s'agit. Donc, vous devriez modifier les deux.

Mais votre code est cassé car vous n'appelez pas le prochain hook (en utilisant CallNextHookEx). Donc, vous désactivez tous les hooks sauf le vôtre, qui est mauvais.

Mon code pascals pour cela (Il était un hack rapide, donc il est un peu laid):

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; 
Questions connexes