2012-03-14 44 views
8

我想檢測何時表格將被最大化以保存某些設置(與尺寸和位置無關)並修改尺寸和位置。有沒有一種通用的方式來做到這一點? 我試圖捕捉WM_SYSCOMMAND消息,如this article。通過按下最大化按鈕,它可以很好地實現菜單最大化,但是當按下WIN + UP鍵時它不會被觸發。有沒有人知道如何捕捉最大化事件的普遍方式,包括WIN + UP按鍵的情況?如何檢測表單何時被最大化?

感謝

+4

您可以處理'WM_GETMINMAXINFO'。 – kobik 2012-03-14 14:45:37

+0

@ kobik,謝謝,但是大小和位置並不是我想要做的唯一的事情(壞例子,我知道)。我真的需要檢測窗口何時會被最大化,並且我無法在WM_GETMINMAXINFO中識別它。 – 2012-03-14 14:50:03

回答

11

可以使用WM_GETMINMAXINFO消息保存窗口的狀態,然後使用WMSize消息以檢查窗口最大化。

在您構成聲明mesage處理,像這樣:

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 2012-03-14 15:07:51

+1

@kobik,這個消息是最大化後觸發的,OP可以使用'WM_GETMINMAXINFO'來保存狀態,然後使用'WMSize'來檢查窗口是否被最大化。 – RRUZ 2012-03-14 15:21:56

7

WIN + UP不會產生WM_SYSCOMMAND的消息,這就是爲什麼你不能抓住他們。但它確實生成了WM_GETMINMAXINFO,WM_WINDOWPOSCHANGING,WM_NCCALCSIZE,WM_MOVE,WM_SIZEWM_WINDOWPOSCHANGED消息。像RRUZ說的那樣,使用WM_GETMINMAXINFO來檢測最大化操作即將開始,並且WM_SIZE檢測何時完成。

7

IMO,您不能使用WM_GETMINMAXINFO爲「檢測時,最大化操作即將開始」爲@Remy說。但它不被髮送經由Win+UP,或通過使用ShowWindow(Handle, SW_MAXIMIZE)例如 -

在-事實可以是WM_SYSCOMMANDMsg.CmdType=SC_MAXIMIZE或無證SC_MAXIMIZE2 = $F032的唯一消息。

我能檢測到一個窗口即將最大化的唯一途徑是通過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; 
相關問題