2010-03-15 23 views
7

Hey, C# 'da bir program yazmaya çalışıyorum, bu da bazı tuşların basılmasını (klavye kancası kullanarak) izlemeye ve farklı olanları göndermeye çalışıyorum. Örneğin, A tuşuna bastığımda, bunun yerine Q tuşunu gönderecektir.C# ile basılmakta olan tuşu değiştirin. #

Bu benim kancalarım için http://www.codeproject.com/KB/cs/CSLLKeyboardHook.aspx kullanmış ve SendKeys işlevini kullanmaya çalışmıştım, ancak kanca toplayıcı içindeki bazı nesneleri yok eden çöp toplayıcı hakkında bir istisna alıyorum.

+3

tuş vuruşlarını Ben U ve S R V için göndermek olacağını merak bot falan ... bir çeşit önlemek için engellediniz? ya da çok alaycı mıyım? – Pharabus

+0

aslında WC3 için kolay kısayol tuşu yerleşimini zorlamak içindir (çünkü bunları değiştiremezsiniz). Ama evet, bunun kötü olduğunu anlıyorum. – Benny

+0

Yani bu bir web uygulaması için mi? (W3C)? – Pharabus

cevap

0

Ve kanca sınıfınıza baktığınızda sorunun kaynağı nedir? Düzgün yönetilmeyen bir kaynak gibi geliyor. Bunu bir tür pratik şaka olarak yapmayı planlıyorsanız, bunların hiçbir zaman iyi gitmemesini sağlayın, çünkü genellikle bunları devre dışı bırakamayacağınız farkına varırsınız. Ayrıca, bu tür etik olmayan bir konunun büyük olasılıkla pek desteklenmeyeceğini de kabul edin.

+0

+1. – Val

+1

Ayrıca, bu tür bir şeyin klavye düzenlerini değiştirmek gibi meşru kullanımları olduğunu anlayabileceğimi düşündüm. Örneğin: QORER to DVORAK – Val

+0

Kesinlikle yasal kullanımları vardır ... Klavyede de aptal tuşları geçersiz kılmak isteyebilirim – pug

4

İlk önce anahtarları bağlamanız gerekir.

Bu sınıfla genel bir kısayolu kaydedebilirsiniz, açıklamayı atlıyorum ancak 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); 
    } 
} 

Sonra form üzerinde size Keyboard basın yönetmek ve olayları serbest bırakmak için burada kısayol

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); 
    } 
} 

Ve sınıfı kaydetmek gerekir.

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); 
    } 
} 

Ben o Q gönderiyordu A bastırdı ben yazıyorum bu textarea üzerinde test ettik. Ne Warcraft III üzerinde davranış olacaktır emin değilim

, belki onlar

+0

İlgili https://brunolm.wordpress.com/2015/03/09/automating-keyboard-keypress-and-mouse-clicks-with- AutoIt3 / – BrunoLM