2012-03-07 10 views
1

MSDNのthis pageによれば、左コントロールのKey Valueは162です。このキーがコードで押されているかどうかはどのように判断できますか?現時点では、キー入力を処理しようとするたびに、汎用制御キーである値17が得られます。 2つを区別する方法はありますか?私はProcessCmdKeyをオーバーライドして、テキストボックスのPreviewKeyDownを処理しようとしましたが、両方とも162の代わりに17を返します。すべての修飾キーでこれを行う必要があります。最後に値をハードコードする前に、 ?特定の修飾キーを取得する

編集:コードが追加されました。明確にするために、私は162の数字を検索し、修飾子を区別する別の方法を見つけるだけではありません。

private void PortfolioNameTextBox_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) 
{ 
    var val = e.KeyValue; //17 when control is pressed and not 162 

} 

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
{ 
    //msg.Wparam = 17 
    return base.ProcessCmdKey(ref msg, keyData); 
} 
+0

あなたがキー入力をキャプチャするために使用しているコードを提供することができます(私はあなたがそれをキャプチャすると仮定しますあなたのフォーム内からではなく世界中から) –

+0

私はコードを追加しました。はい、フォームだけです。 – XSL

+0

WinFormsでは、あなたは運がないと思います。アプリケーションに渡されるキーコードのみを扱うことができます。潜在的な回避策は、グローバルキーフックを設定し、現在のアプリケーションが自分のものであることを確認することです。 –

答えて

2

Messr Passant answeredこの多くの月前。 KeyEventArgsはそれが含まれている場合

はいいだろうが、それにもかかわらず、あなたはこのようにそれを達成することができます:

[DllImport("user32.dll")] 
    private static extern short GetAsyncKeyState(Keys key); 

    private void textBox1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) 
    { 
     Console.WriteLine("Ctrl:{0}, LCtrl:{1}, RCtrl:{2}", 
     GetAsyncKeyState(Keys.ControlKey) < 0, 
     GetAsyncKeyState(Keys.LControlKey) < 0, 
     GetAsyncKeyState(Keys.RControlKey) < 0); 
    } 
+0

ああ、ちょうどあなたのコメントを読んで...あなたは無差別にそのアプローチを使用してあなたの魔法162を得ることができました。たとえば、(GetAsyncKeyState(Keys.LControlKey)<0)がKeys.LControlKeyを返しますが、理想的ではありません –

関連する問題