ユーザー定義の PostMessage(WM_GROUPUNGROUP) を送信する KeyDown ハンドラーを内部に持ち、WM_GROUPUNGROUP を処理するカスタム メッセージ ハンドラーを持つコンポーネントを使用しています。
コンポーネント コードを変更せずに、このメッセージ ハンドラーが実行された後にアプリで何かを実行したいと考えています。
(どのように)これはできますか?
ユーザー定義の PostMessage(WM_GROUPUNGROUP) を送信する KeyDown ハンドラーを内部に持ち、WM_GROUPUNGROUP を処理するカスタム メッセージ ハンドラーを持つコンポーネントを使用しています。
コンポーネント コードを変更せずに、このメッセージ ハンドラーが実行された後にアプリで何かを実行したいと考えています。
(どのように)これはできますか?
これを実現する 1 つの方法は、WindowProc
プロパティを使用することです。
WindowProc
フックするインスタンスに割り当てて、独自のウィンドウ プロシージャを提供するだけです。WindowProc
元の処理が確実に実行されるように、 の以前の値にコピーする必要があります。
おおむね次のようになります。
type
TMyClass = class
....
FOldWindowProc: TWndMethod;
procedure NewWindowProc(var Message: TMessage);
....
end;
ウィンドウ プロシージャをリダイレクトするには、次のようにします。
FOldWindowProc := SomeControl.WindowProc;
SomeControl.WindowProc := NewWindowProc;
次に、新しいウィンドウ プロシージャを次のように実装します。
procedure TMyClass.NewWindowProc(var Message: TMessage);
begin
FOldWindowProc(Message);
if Message.Msg = WM_GROUPUNGROUP then
....
end;
コントロールの操作が完了したら、古いウィンドウ プロシージャを元の場所に戻します。
SomeControl.WindowProc := FOldWindowProc;
もう 1 つの方法は、メッセージがキューに入れられているという事実を利用することです。Application.OnMessage
ほとんどの場合、オブジェクトを使用してハンドラーを追加できTApplicationEvents
ます。これにより、キューに入れられたすべてのメッセージが表示されます。ただし、OnMessage
メッセージがコントロールにディスパッチされる前に発生するため、間違った方法である可能性があります。