2012-03-14 8 views
8

フォームが最大化されて特定の設定(サイズや位置に関係しない)を保存し、サイズと位置を少し変更する場合は、検出したいと思います。普遍的な方法がありますか? this articleのようなWM_SYSCOMMANDメッセージをキャッチしようとしました。これはメニューからの最大化のためにボタンを最大化することでうまくいきますが、WIN + UPキーストロークを押すと起動しません。 WIN + UPのキーストロークを含む最大化イベントをどのように捕捉するのか、普遍的な方法を知っている人はいますか?フォームが最大化されているときを検出するにはどうすればよいですか?

おかげ

+4

。 – kobik

+0

@kobik、ありがとう、しかし、サイズと位置が私がしたい唯一のものではありません(悪い例、私が知っている)。ウィンドウが最大化されるときを検出する必要があり、WM_GETMINMAXINFOでそのウィンドウを認識できません。 –

答えて

11

あなたは、ウィンドウの状態を保存するためにWM_GETMINMAXINFOメッセージを使用して、ウィンドウが最大化されたかどうかを確認するWMSizeメッセージを使用することができます。

procedure WMSize(var Msg: TMessage); message WM_SIZE; 

そして、このように対処:あなたの中に

はそうのようなメッセージを指定ハンドラを宣言形成

procedure TForm57.WMSize(var Msg: TMessage); 
begin 
    if Msg.WParam = SIZE_MAXIMIZED then 
    ShowMessage('Maximized');  
end; 
+1

この火災は遅すぎますか? (*後は*フォームが最大化されます)。 – kobik

+1

@kobikはい、このメッセージは最大化後に起​​動し、OPは 'WM_GETMINMAXINFO'を使用して状態を保存し、' WMSize'を使ってウィンドウが最大化されたかどうかを確認できます。 – RRUZ

7

WIN + UPは、あなたがそれらをキャッチすることができない理由がある、WM_SYSCOMMANDメッセージを生成しません。しかし、WM_GETMINMAXINFOWM_WINDOWPOSCHANGINGWM_NCCALCSIZEWM_MOVEWM_SIZE、およびWM_WINDOWPOSCHANGEDというメッセージが生成されます。 RRUZと同様に、WM_GETMINMAXINFOを使用して最大化操作が開始されようとしていることを検出し、終了時にWM_SIZEを検出します。

7

IMO、あなたは@Remyが述べたように、「最大化操作はを開始しようあるときを検出する」WM_GETMINMAXINFOを使用することはできません。イン事実

缶は、Msg.CmdType=SC_MAXIMIZEまたは非公開SC_MAXIMIZE2 = $F032WM_SYSCOMMANDのみメッセージ - それはWin+UPを介して、または例えばShowWindow(Handle, SW_MAXIMIZE)を使用して送信されていません。

私はウィンドウを最大化されようとしていることを検出することができる唯一の方法は、右WM_GETMINMAXINFO後に解雇されたWM_WINDOWPOSCHANGINGを経由している:あなたは `WM_GETMINMAXINFO`を扱うことができる

type 
    TForm1 = class(TForm) 
    private 
    procedure WMWindowPosChanging(var Message: TWMWindowPosChanging); message WM_WINDOWPOSCHANGING; 
    end; 

implementation 

const 
    SWP_STATECHANGED = $8000; 

procedure TForm1.WMWindowPosChanging(var Message: TWMWindowPosChanging); 
begin 
    inherited; 
    if (Message.WindowPos^.flags and (SWP_STATECHANGED or SWP_FRAMECHANGED)) <> 0 then 
    begin 
    if (Message.WindowPos^.x < 0) and (Message.WindowPos^.y < 0) then 
     ShowMessage('Window state is about to change to MAXIMIZED'); 
    end; 
end; 
関連する問題