2012-01-19 6 views
1

私はのイベントを処理しますユーザーのドラッグアンドドロップが機能している間に "KeyDown"。ドラッグドロップ中のKeyDownを処理します。またはkeydownイベントが動作していません

使用例。 ユーザーが「alt」をクリックすると、カーソルの下の画像が変更され、ユーザーは追加項目データをドロップできます。

しかし、KeyDownはまったく機能しません。エスケープボタンのみ!

助けてください。私は実際にイベントを決定する必要があります。

p.s.私はこのコードを試しました:

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

しかし、私はマウスの移動だけでクリックしたボタンを決定することができます。しかし、私は本当にキーダウンイベントが必要です。

bool isKeyPressed = Keyboard.IsKeyDown(Key.LeftAlt); 

をそしてDragEnterイベント、DragOver DragOverは同様に、あなたのニーズに合った良いと考えたイベントに入れたり、タイマーを使用し、一定の速度でキーの状態をチェックします。

+0

フォーカスがあるコントロールはありませんが、マウスキャプチャを行っているフォームでKeyDownイベントが発生します。何を試しましたか? – arx

+0

すべての可能なコントロールは "keydown"ハンドラで署名されました。 – Evgeny

+1

私はspy ++を実行して、キーボードメッセージがどこに送られているか確認します。彼らは間違いなく生成されます。 – arx

答えて

2

あなたは、使用しようとすることができます。

あなたは(各100ミリ秒のような)十分な頻度でイベントを起動タイマーを使用している場合、瞬時に反応するように表示されます。追加のフラグを使用して、各キーの押下と解除を一度に行うことができます(タイマーがイベントを発生させるたびに)。

UPDATE

私はちょうどそれをテストするために、これを実現したのだが、ユーザーが何かを(私はテキストをドラッグするためにこれをテストした)ドラッグされた場合でも正常に動作するようです。

使用すると、1つの特定のキー(左ALT)のためのイベントアップとキーダウンキーを検出したい場合には、単純なケースのためだが、非常に簡単にあなたが望む限り多くのキーを監視するように変更することができます。

まず、あなたがダウンキーを検出したいウィンドウのクラスに二つのフィールドを追加とアップキー:ここで使用される

DispatcherTimer timer = new DispatcherTimer(); 
bool keyPressed = false; 

DispatcherTimerので、タイマーによって発生するイベントですウィンドウのUIスレッドのコンテキストで実行されます。

次に、ウィンドウのLoadedイベントにメソッドWindow_Loadedを追加します。

その後、あなたはあなただけLoadedイベントハンドラとして追加したメソッドを実装することができ、そこからタイマーを初期化:

private void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    timer.Tick += new EventHandler(timer_Tick); 
    //timer will raise an event checking key state each 100ms 
    timer.Interval = TimeSpan.FromMilliseconds(100); 
    timer.Start(); 
} 

最後に、あなたはそのキーの状態をチェックしてtimer_Tickメソッドの実装を追加する必要がありますあなたは監視したいと思う:

void timer_Tick(object sender, EventArgs e) 
    { 
     if (Keyboard.IsKeyDown(Key.LeftAlt)) 
     { 
      //checking flag to handle each key press only once 
      if (!keyPressed) 
      { 
       keyPressed = true; 

       //TODO: write your key down handling code here 
       //i.e.: sampleRichTextBox.AppendText("Left Alt is down;\t"); 
      } 
     } 
     else 
     { 
      //checking flag to handle each key release only once 
      if (keyPressed) 
      { 
       keyPressed = false; 

       //TODO: write your key up handling code here 
       //i.e.: sampleRichTextBox.AppendText("Left Alt is up;\t"); 
      } 
     } 
    } 

この解決策についてさらに詳しい情報が必要な場合は、私に教えてください。

+0

誰も答えないなら、私はあなたにrigntのように答えるとマークします。しかし、私は実際にkeydownイベントを一度必要とします(タイマーはイベントを急速に発射します)。 – Evgeny

+1

いいえ、キーが押されたかどうかを確認し、各プレスごとに "イベント"を1回処理し、解放するまでスキップします。しかし、それを行うための他の方法があるかどうかを見ていきます。 –

+1

私はWinApiの方法で各メッセージを取得するためにWndProcを使用しようとしましたが、ユーザーがテキストをドラッグしてもWM_KEYDOWNは起動されません。また、ユーザーがドラッグされたオブジェクトをドロップしたときに押されたキーを特定しようとすることもできますが、タイマーを使用すると実際に発生するイベントに近いものになります。 –

関連する問題