2010-03-15 14 views
7

Hey, ich versuche, ein Programm in C# zu schreiben, die das Drücken bestimmter Tasten (mit einem Tastatur-Hook) verfolgen, und senden Sie stattdessen andere.Ändern Sie die Taste gedrückt mit C#

Zum Beispiel, wenn ich die A-Taste drücke, wird stattdessen die Q-Taste gesendet.

Ich habe http://www.codeproject.com/KB/cs/CSLLKeyboardHook.aspx dies für meine Hooks und versuchte, die SendKeys-Funktion zu verwenden, aber ich bekomme eine Ausnahme über den Garbage Collector zerstören einige Objekte innerhalb der Hook-Klasse.

+3

fragen, was es für die Tastenanschläge I R U und S V schicken würde verhindern blockiert? oder bin ich sehr zynisch? – Pharabus

+0

ist eigentlich nur eine einfache Hotkey-Platzierung für WC3 zu erzwingen (weil Sie sie nicht ändern können). Aber ja, ich verstehe das klingt schlecht. – Benny

+0

so ist dies für eine Web-App? (W3C)? – Pharabus

Antwort

0

Und wenn Sie Ihre Hook-Klasse betrachten, was ist die Ursache des Problems? Es klingt wie eine Ressource, die nicht richtig verwaltet wird.

Erkennen Sie, dass, wenn Sie planen, dies als eine Art von praktischer Witz zu tun, diese nie gut gehen, weil im Allgemeinen der Unfähigkeit, diese auszuschalten. Erkenne auch, dass diese Art von scheinbar unethischem Thema wahrscheinlich nicht viel Unterstützung bekommen wird.

+0

+1 für die Warnung bezüglich Deaktivierungsschwierigkeiten. – Val

+1

Auch ich dachte, ich könnte eingreifen, dass diese Art von Sache legitime Verwendungen hat, wie zum Beispiel Tastaturlayouts zu wechseln. ZB: QWERTY zu DVORAK – Val

+0

Definitiv hat legitimen Gebrauch ... Ich möchte auch dumme Tasten auf der Tastatur sowie – pug

4

Zuerst müssen Sie die Schlüssel anschließen.

Mit dieser Klasse können Sie eine globale Verknüpfung registrieren, ich überspringe die Erklärung, aber Sie können read it here.

public class KeyboardHook 
{ 
    [DllImport("user32.dll")] 
    private static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vk); 

    [DllImport("user32.dll")] 
    private static extern bool UnregisterHotKey(IntPtr hWnd, int id); 

    public enum Modifiers 
    { 
     None = 0x0000, 
     Alt = 0x0001, 
     Control = 0x0002, 
     Shift = 0x0004, 
     Win = 0x0008 
    } 

    int modifier; 
    int key; 
    IntPtr hWnd; 
    int id; 

    public KeyboardHook(int modifiers, Keys key, Form f) 
    { 
     this.modifier = modifiers; 
     this.key = (int)key; 
     this.hWnd = f.Handle; 
     id = this.GetHashCode(); 
    } 

    public override int GetHashCode() 
    { 
     return modifier^key^hWnd.ToInt32(); 
    } 


    public bool Register() 
    { 
     return RegisterHotKey(hWnd, id, modifier, key); 
    } 
    public bool Unregister() 
    { 
     return UnregisterHotKey(hWnd, id); 
    } 
} 

Dann auf dem Formular haben Sie die Verknüpfung

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 

     KeyboardHook hook = new KeyboardHook((int)KeyboardHook.Modifiers.None, Keys.A, this); 

     hook.Register(); // registering globally that A will call a method 
    } 

    protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == 0x0312) 
      HandleHotkey(); // A, which was registered before, was pressed 
     base.WndProc(ref m); 
    } 

    private void HandleHotkey() 
    { 
     // instead of A send Q 
     KeyboardManager.PressKey(Keys.Q); 
    } 
} 

Und hier die Klasse registrieren Keyboard drücken und loslassen Ereignisse zu verwalten.

public class KeyboardManager 
{ 
    public const int INPUT_KEYBOARD = 1; 
    public const int KEYEVENTF_KEYUP = 0x0002; 

    public struct KEYDBINPUT 
    { 
     public Int16 wVk; 
     public Int16 wScan; 
     public Int32 dwFlags; 
     public Int32 time; 
     public Int32 dwExtraInfo; 
     public Int32 __filler1; 
     public Int32 __filler2; 
    } 

    public struct INPUT 
    { 
     public Int32 type; 
     public KEYDBINPUT ki; 
    } 

    [DllImport("user32")] 
    public static extern int SendInput(int cInputs, ref INPUT pInputs, int cbSize); 

    public static void HoldKey(Keys vk) 
    { 
     INPUT input = new INPUT(); 
     input.type = INPUT_KEYBOARD; 
     input.ki.dwFlags = 0; 
     input.ki.wVk = (Int16)vk; 
     SendInput(1, ref input, Marshal.SizeOf(input)); 
    } 

    public static void ReleaseKey(Keys vk) 
    { 
     INPUT input = new INPUT(); 
     input.type = INPUT_KEYBOARD; 
     input.ki.dwFlags = KEYEVENTF_KEYUP; 
     input.ki.wVk = (Int16)vk; 
     SendInput(1, ref input, Marshal.SizeOf(input)); 
    } 

    public static void PressKey(Keys vk) 
    { 
     HoldKey(vk); 
     ReleaseKey(vk); 
    } 
} 

Ich habe es auf diesem Textfeld getestet, die ich schreibe, wenn ich A drückte sie Q sendete.

Ich bin nicht sicher, was das Verhalten auf Warcraft III sein wird, vielleicht haben sie eine Art von Bot oder etwas ...

+0

Verwandte https://brunolm.wordpress.com/2015/03/09/automation-keyboard-keypress-and-mouse-clicks-with- autoit3 / – BrunoLM

Verwandte Themen