0

ユーザー定義の PostMessage(WM_GROUPUNGROUP) を送信する KeyDown ハンドラーを内部に持ち、WM_GROUPUNGROUP を処理するカスタム メッセージ ハンドラーを持つコンポーネントを使用しています。

コンポーネント コードを変更せずに、このメッセージ ハンドラーが実行された後にアプリで何かを実行したいと考えています。

(どのように)これはできますか?

4

1 に答える 1

4

これを実現する 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メッセージがコントロールにディスパッチされる前に発生するため、間違った方法である可能性があります。

于 2013-09-26T13:59:20.607 に答える