バックグラウンド:
TCustomControl
フォーカスを取得でき、内部要素がいくつかあるクラスから派生したコントロールに取り組んでいます。これらの内部要素は、ユーザーがカーソルでそれらをホバーすると強調表示され、それらを選択したり、移動したりできます。今問題に...
問題:
CTRLユーザーが、ALTまたはSHIFT修飾子を保持している場合、(たとえば)フォーカスされた要素でさまざまなアクションを実行しています。私が望むのは、ユーザーが要素をホバーしてインスタンスCTRLキーを保持している場合、マウスカーソルを変更することです。KeyDown
とKeyUp
メソッドをオーバーライドして、それらのKey
パラメータが に等しいかどうかを確認するだけですVK_CONTROL
。このようにコードで:
procedure TMyCustomControl.KeyDown(var Key: Word; Shift: TShiftState);
begin
inherited;
if Key = VK_CONTROL then
Screen.Cursor := crSizeAll;
end;
procedure TMyCustomControl.KeyUp(var Key: Word; Shift: TShiftState);
begin
inherited;
if Key = VK_CONTROL then
Screen.Cursor := crDefault;
end;
CTRLキーが押されて離されたかどうかを確認する最良の方法ではない場合でも(たとえば、既存のShift
状態パラメーターが原因で)、コントロールにフォーカスがある場合は期待どおりに機能し、取得することもできますが...
私の目的は、ユーザーがコントロール (または正確には、その中の特定の要素) をホバーしたときにマウスカーソルを変更し、CTRLコントロールにフォーカスがない場合でもそのキーを保持することです。MouseMove
言うことができるので、メソッドをオーバーライドして、そこで修飾子の状態を要求するだけです。そしてそれは方法でしょうが...
ユーザーがコントロールの上にマウス カーソルを置いたまま、そのCTRLキーを押して離すとどうなりますか? それは私のコントロールに対してマウスの動きやキーを押すイベントを生成しませんか、それとも間違っていますか? さて、私の質問は非常に明白です...
質問:
コントロールにフォーカスがなく、ユーザーがマウスで動かない場合、修飾キーの変更を検出するにはどうすればよいですか? 私はこれらの 2 つのオプションについて考えていましたが、私が見逃したものがあることを願っています。
- キーボード フック - 信頼性は高いですが、私にはやり過ぎに見えます
- タイマーを使用したモディファイヤの状態の定期的なチェック - 遅れてはいられない
では、現在フォーカスされていないコントロールの修飾キーの変更をどのように検出しますか?