2009-06-18 8 views
1

ウェッジデバイスからキーストロークをキャプチャして、コントロールやフォームがそれを受信できないようにする必要があります。私はまた、値(char)を知ることができる必要があります。私はProcessCmdKey(キー)とProcessDialogChar(char)イベントをオーバーライドしようとしました。 ProcessCmdイベントでは、キーストロークを抑制することができますが、それは私が望むものですが、文字はイベントのパラメータではありません。 ProcessDialogCharイベントでは、文字はそこにありますが、キーを受け取ってフォーカスを持つフォームまたはコントロールを防ぐことはできません。提案?キーストロークのキャプチャ

答えて

1

私はそれをやりたいとは思っていませんでしたが、これを修正して移動する必要があったため、フォームに隠れたテキストボックスを置いて、すぐにデータ文字列キャプチャしたいテキストボックスにフォーカスを合わせ、TextChangedイベントに応答します。タイマーの期限が切れる前に終わりの文字が見えない場合、テキストボックスをクリアしてもう一度やり直します。クルージュ、それは動作し、次の作業に私を得た。

5

フォームのロード中にこれを追加することをお勧めします:

private const int WM_KEYDOWN = 0x100; 

そして、この方法:

public bool PreFilterMessage(ref Message m) 
{ 
    Keys keyCode = (Keys)(int)m.WParam & Keys.KeyCode; 
    bool retVal = false; 

    if (m.Msg == WM_KEYDOWN) 
    { 
     // Handle the keypress 
     retVal = true; 
    } 

    return retVal; 
} 

trueを返すことにより、フォーム

Application.AddMessageFilter(this); 

は、この定数を追加コントロールはキーを押すことはありません。

+0

私は明確にしなかったもののノートのいくつか:IMessageFilterを実装する必要があります。これには、PreFilterMessageという1つのメソッドがあります。実際にフォーム上に実装する必要はありません。このインターフェースを実装したい場合は、完全に別のオブジェクトを作成することができます。私はよく分かりませんが、メッセージフィルタはGUIスレッドのメッセージポンプに属しているので、フォームが作成される前にAddMessageFilterを呼び出すことができます。 – jasonh

+0

ありがとう、私はそれを行って、それは動作しますが、私はまだProcessCmdKeyをオーバーライドしていたのと同じ苦境にいます。私は実際のキャラクターを入力する必要はありません。例えば私のキーボードでは、文字「^」はkeyCode D6です。シフトキーをパラメータの1つから抜け出すことができます。私は自分自身に翻訳することを避けようとしています。 – jac

関連する問題