2012-02-23 9 views
16

マウスボタンを押してウィンドウを表示すると、マウスボタンが離されたときにMouseUpイベントが表示されます。フォームが表示される前にマウスボタンが既に押されているかどうかを検出

ウィンドウが表示されたら、マウスボタンが既に押されているかどうかを検出できますか?

+0

GetAsyncKeyState(VK_LBUTTON) – ComputerSaysNo

+5

'GetAsyncKeyState'は物理的なマウスボタンの状態を返しますが、' GetKeyState'は論理的なものを返します(マウスの 'Switch primary and secondary buttons'オプションで何を設定したのか設定)。 – TLama

答えて

16

私はこれをしようとするだろう:

procedure TForm1.FormShow(Sender: TObject); 
begin 
    if GetKeyState(VK_LBUTTON) and $8000 <> 0 then 
    ShowMessage('Left mouse button is pressed...') 
    else 
    ShowMessage('Left mouse button is not pressed...') 
end; 
+3

ありがとう、これは正しい....ほぼです。正しいビットが設定されているかどうかを確認するには、GetKeyStateの結果を$ 8000(http://stackoverflow.com/a/3422706/41338参照)と比較する必要があります。 – RobS

+0

あなたは間違いなく正しいです。ありがとう!投稿を更新します。誤解を招いて申し訳ありません。 – TLama

+2

説明のために+1 – EMBarbosa

9

が直接あなたの質問に答えるために、あなたはGetKeyStateまたはGetAsyncKeyStateでマウスボタンの状態をテストすることができます。必要な仮想キーコードはVK_LBUTTONです。

これらの違いは、GetKeyStateが、現在アクティブなキューに入れられたメッセージがキューに投稿された時点の状態を報告することです。一方、GetAsynchKeyStateは、GetAsynchKeyStateと呼んでいる瞬間の状態を示します。 GetKeyStateのドキュメントから

スレッドがメッセージ・キューからのキーメッセージを読み取って、この機能の変化から返されたキーの状態。ステータスは、ハードウェアに関連する割り込みレベルの状態を反映していません。その情報を取得するには、GetAsyncKeyState関数を使用します。 アプリケーションは、キーボード入力メッセージに応答してGetKeyStateを呼び出します。この関数は、入力メッセージが生成されたときにキーの状態を取得します。

GetKeyStateを使用する必要があると思われますが、この情報で達成しようとしていることが実際にわからないため、100%確信できません。

+0

2つの機能の違いを説明してくれてありがとう。 GetKeyStateが必要なのは正しいですなぜ私がこれを必要とするかについての鈍い追加情報は、最後にリリースされたマウスボタンを基にした出力を持つフォームを作成していることです。もともとは、マウスボタンが押されているとカウントしていましたが、リリースされてから数えていましたが、フォームが表示される前にマウスボタンの1つが押されることがありました。ただし、このコマンドを使用すると、他のマウスボタンがまだ押されているかどうかを、各mouseupイベントで確認できます。 – RobS

+2

+1理由の説明 – EMBarbosa

関連する問題