我想檢測何時表格將被最大化以保存某些設置(與尺寸和位置無關)並修改尺寸和位置。有沒有一種通用的方式來做到這一點? 我試圖捕捉WM_SYSCOMMAND消息,如this article。通過按下最大化按鈕,它可以很好地實現菜單最大化,但是當按下WIN + UP鍵時它不會被觸發。有沒有人知道如何捕捉最大化事件的普遍方式,包括WIN + UP按鍵的情況?如何檢測表單何時被最大化?
感謝
我想檢測何時表格將被最大化以保存某些設置(與尺寸和位置無關)並修改尺寸和位置。有沒有一種通用的方式來做到這一點? 我試圖捕捉WM_SYSCOMMAND消息,如this article。通過按下最大化按鈕,它可以很好地實現菜單最大化,但是當按下WIN + UP鍵時它不會被觸發。有沒有人知道如何捕捉最大化事件的普遍方式,包括WIN + UP按鍵的情況?如何檢測表單何時被最大化?
感謝
可以使用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;
WIN + UP不會產生WM_SYSCOMMAND
的消息,這就是爲什麼你不能抓住他們。但它確實生成了WM_GETMINMAXINFO
,WM_WINDOWPOSCHANGING
,WM_NCCALCSIZE
,WM_MOVE
,WM_SIZE
和WM_WINDOWPOSCHANGED
消息。像RRUZ說的那樣,使用WM_GETMINMAXINFO
來檢測最大化操作即將開始,並且WM_SIZE
檢測何時完成。
IMO,您不能使用WM_GETMINMAXINFO
爲「檢測時,最大化操作即將開始」爲@Remy說。但它不被髮送經由Win+UP
,或通過使用ShowWindow(Handle, SW_MAXIMIZE)
例如 -
在-事實可以是WM_SYSCOMMAND
與Msg.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;
您可以處理'WM_GETMINMAXINFO'。 – kobik 2012-03-14 14:45:37
@ kobik,謝謝,但是大小和位置並不是我想要做的唯一的事情(壞例子,我知道)。我真的需要檢測窗口何時會被最大化,並且我無法在WM_GETMINMAXINFO中識別它。 – 2012-03-14 14:50:03