2013-03-21 8 views
2

Я пытаюсь сделать простой ключевой remapper - когда нажата одна клавиша клавиатуры, другое нажатие клавиши, сгенерированное кодом. Вот мой код:событие клавиатуры работает только один раз

[DllImport("user32.dll")] 
static extern uint keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo); 
public static void KeyDown(System.Windows.Forms.Keys key) 
{ 
    keybd_event((byte)key, 0, 0, 0); 
} 
public static void KeyUp(System.Windows.Forms.Keys key) 
{ 
    keybd_event((byte)key, 0, 0x7F, 0); 
} 
protected override void WndProc(ref Message m) 
     { 
      if (m.Msg == 0x0312) 
      { 
       int id = m.WParam.ToInt32(); 
       ... 
       if (id==2) { 
        KeyDown(Keys.Return); 
        KeyUp(Keys.Return);  
       } 
       ...   
      } 
      base.WndProc(ref m); 
     } 

Проблема, когда я нажимаю горячую клавишу назначен идентификатор 2, этот пресс-код возврата работает только один раз в 30 секунд, может быть. Что не так с этой функцией winapi keybd_evend? Я использовал это неправильно? Нет ничего плохого в других вещах (ids) в wndProc, неприятностях только с keybd_event.

ответ

3

Poblem был в неправильных функциях KeyUp и KeyDown. Вот верные функции:

[DllImport("user32.dll")] 
static extern uint keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo); 
public static void KeyDown(System.Windows.Forms.Keys key) 
{ 
     keybd_event((byte)key, 0x45, 0x0001 | 0, 0); 
} 

public static void KeyUp(System.Windows.Forms.Keys key) 
{ 
     keybd_event((byte)key, 0x45, 0x0001 | 0x0002, 0); 
} 
Смежные вопросы