2016-03-24 16 views
0

は、私が「キュー空」の例外が、ここで私のprocesure「キュー空の」例外

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

       if (vkCode == 160 || vkCode == 161) { shift = 1; } 
       if (vkCode == 162 || vkCode == 163) { ctrl = 1; } 
       if (vkCode == 164 || vkCode == 165) { alt = 1; } 
       Console.WriteLine(vkCode + "_" + shift); 
       int res = replaceKey.getReplacedKey(vkCode, shift); 
       if (res != -1 && ctrl == 0 && alt == 0 && getCurrentKeyboardLangauge().Contains("Hebrew")) 
       { 
        try 
        { 
         SendKeys.SendWait(char.ConvertFromUtf32((int)res)); 
        } 
        catch (Exception ex) 
        { 
         Debug.Print(ex.Message); 
        } 
        return (System.IntPtr)1; 
       }else if(getCurrentKeyboardLangauge().Contains("Hebrew") && (vkCode == 79 || vkCode == 89 || vkCode == 69 || vkCode == 81 || vkCode == 220 || vkCode == 77 || vkCode == 78 || vkCode == 66 || vkCode == 76 || vkCode == 88 || vkCode == 90 || vkCode == 226)){ 
        return (System.IntPtr)1; 
       } 
      } 
      else if (nCode >= 0 && wParam == (IntPtr)WM_KEYUP) 
      { 
       int vkCode = Marshal.ReadInt32(lParam); 
       //Console.WriteLine(vkCode); 
       if (vkCode == 160 || vkCode == 161) { shift = 0; } 
       if (vkCode == 162 || vkCode == 163) { ctrl = 0; } 
       if (vkCode == 164 || vkCode == 165) { alt = 0; }     
      } 
     return CallNextHookEx(_hookID, nCode, wParam, lParam); 
    } 

どれヘルプ

答えて

1
いくつかの倍のトレース

at System.Collections.Queue.Dequeue() 
    at System.Windows.Forms.SendKeys.SendInput(Byte[] oldKeyboardState, Queue previousEvents) 
    at System.Windows.Forms.SendKeys.Send(String keys, Control control, Boolean wait) 
    at System.Windows.Forms.SendKeys.SendWait(String keys) 
    at WindowsFormsApplication2.InterceptKeys.HookCallback(Int32 nCode, IntPtr wParam, IntPtr lParam) in e:\Programing\C#\TypeHebrew\WindowsFormsApplication2\InterceptKeys.cs:line 69 

で、ここにありました

送信されたキーが「再フック」されて送信され、何度も何度もやり直すので問題が発生したと思います。

同様の状況でこれを回避するには、キーがSendKeysメソッドを介して送信されたキーまたはユーザーのキーストロークであるかどうかを知るために一時ブール値を設定する必要がありました。

このような何か試してください:あなたがここにAutoTyperアプリケーションで同様のアプローチを見ることができます

private static bool _intercept = true; 

private static IntPtr HookCallback(
     int nCode, IntPtr wParam, IntPtr lParam) 
{ 
     if (_intercept) 
     { 
      if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN) 
      { 
       int vkCode = Marshal.ReadInt32(lParam); 

       if (vkCode == 160 || vkCode == 161) { shift = 1; } 
       if (vkCode == 162 || vkCode == 163) { ctrl = 1; } 
       if (vkCode == 164 || vkCode == 165) { alt = 1; } 
       Console.WriteLine(vkCode + "_" + shift); 
       int res = replaceKey.getReplacedKey(vkCode, shift); 
       if (res != -1 && ctrl == 0 && alt == 0 && getCurrentKeyboardLangauge().Contains("Hebrew")) 
       { 
        try 
        { 
         _intercept = false; // Stop listening keystroke for the next key 
         SendKeys.SendWait(char.ConvertFromUtf32((int)res)); 
        } 
        catch (Exception ex) 
        { 
         Debug.Print(ex.Message); 
        } 
        finally 
        { 
         _intercept = true; // Reactivate listening keystroke for the next key 
        } 
        return (System.IntPtr)1; 
       } 
       else if (getCurrentKeyboardLangauge().Contains("Hebrew") && (vkCode == 79 || vkCode == 89 || vkCode == 69 || vkCode == 81 || vkCode == 220 || vkCode == 77 || vkCode == 78 || vkCode == 66 || vkCode == 76 || vkCode == 88 || vkCode == 90 || vkCode == 226)) 
       { 
        return (System.IntPtr)1; 
       } 
      } 
      else if (nCode >= 0 && wParam == (IntPtr)WM_KEYUP) 
      { 
       int vkCode = Marshal.ReadInt32(lParam); 
       //Console.WriteLine(vkCode); 
       if (vkCode == 160 || vkCode == 161) { shift = 0; } 
       if (vkCode == 162 || vkCode == 163) { ctrl = 0; } 
       if (vkCode == 164 || vkCode == 165) { alt = 0; } 
      } 
     } 
     return CallNextHookEx(_hookID, nCode, wParam, lParam); 
    } 

を:https://github.com/nmariot/AutoTyper

関連する問題