2010-07-09 89 views
1

我會感謝任何能夠幫助的人!SendKey命令C#

我正在使用下面的InterceptKeys類來更改某些鍵。例如,當我輸入開放式括號鍵「[」時,我想將其更改爲「ë」(每當我鍵入我的電腦,而不是特定的程序)。 我使用SendKey.Send(「ë」);無論何時輸入「[」,但問題是在「ë」之後輸入「[」。 是否可以用「ë」或任何鍵代替「[」,或者取消「[」和只發送「ë」?


class InterceptKeys 
{ 
    private const int WH_KEYBOARD_LL = 13; 
    private const int WM_KEYDOWN = 0x0100; 
    private static LowLevelKeyboardProc _proc = HookCallback; 
    private static IntPtr _hookID = IntPtr.Zero; 

    public static void Main() 
    { 
     _hookID = SetHook(_proc); 
     Application.Run(); 
     UnhookWindowsHookEx(_hookID); 
    } 

    private static IntPtr SetHook(LowLevelKeyboardProc proc) 
    { 
     using (Process curProcess = Process.GetCurrentProcess()) 
     using (ProcessModule curModule = curProcess.MainModule) 
     { 
      return SetWindowsHookEx(WH_KEYBOARD_LL, proc, 
       GetModuleHandle(curModule.ModuleName), 0); 
     } 
    } 

    private delegate IntPtr LowLevelKeyboardProc(
     int nCode, IntPtr wParam, IntPtr lParam); 

    private static IntPtr HookCallback(
     int nCode, IntPtr wParam, IntPtr lParam) 
    { 
     if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN) 
     { 
      int vkCode = Marshal.ReadInt32(lParam); 
      //Console.WriteLine((Keys)vkCode); 
      if (vkCode == (int)Keys.OemOpenBrackets)) 
      { 

       SendKeys.Send("ë");     

      } 
     } 

     return CallNextHookEx(_hookID, nCode, wParam, lParam); 
    } 

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    private static extern IntPtr SetWindowsHookEx(int idHook, 
     LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId); 

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    private static extern bool UnhookWindowsHookEx(IntPtr hhk); 

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, 
     IntPtr wParam, IntPtr lParam); 

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    private static extern IntPtr GetModuleHandle(string lpModuleName); 
} 

回答

1

返回1,如果你處理的,而不是調用CallNextHookEx的關鍵。

IE,HookCallback()應該是這樣的

private static IntPtr HookCallback(
    int nCode, IntPtr wParam, IntPtr lParam) 
{ 
    if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN) 
    { 
     int vkCode = Marshal.ReadInt32(lParam); 
     //Console.WriteLine((Keys)vkCode); 
     if (vkCode == (int)Keys.OemOpenBrackets)) 
     { 

      SendKeys.Send("ë");     
      return 1; 
     } 
    } 

    return CallNextHookEx(_hookID, nCode, wParam, lParam); 
} 
+0

這工作完全:) 非常感謝你非常感謝! – Coalen 2010-07-09 20:08:46

+0

很高興我能幫到你。標記爲答案並投票。 :) – 2010-07-09 20:47:27

+0

不幸的是我不能投票。當我嘗試:「投票要求15聲望」時,我會收到此消息。 無論如何,我將其標記爲我接受的答案。 – Coalen 2010-07-13 17:39:47