2012-03-14 37 views
8

Tôi muốn phát hiện khi biểu mẫu sẽ được phóng to để lưu các cài đặt nhất định (không liên quan đến kích thước cũng như vị trí) và sửa đổi kích thước và vị trí một chút. Có cách nào phổ biến để làm điều đó không? Tôi đã cố gắng nắm bắt thông báo WM_SYSCOMMAND như trong this article. Nó hoạt động tốt để tối đa hóa từ menu, bằng cách phóng to nút, nhưng nó không được kích hoạt khi tôi nhấn tổ hợp phím WIN + UP. Có ai biết một cách phổ quát làm thế nào để nắm bắt các sự kiện tối đa bao gồm cả trường hợp với WIN + UP tổ hợp phím?Cách phát hiện khi biểu mẫu đang được phóng to?

Cảm ơn

+4

bạn có thể xử lý 'WM_GETMINMAXINFO'. – kobik

+0

@kobik, cảm ơn, nhưng kích thước và vị trí không phải là điều duy nhất tôi muốn làm (ví dụ xấu, tôi biết). Tôi thực sự cần phải phát hiện khi nào cửa sổ sẽ được phóng to và tôi không thể nhận ra nó trong WM_GETMINMAXINFO. –

Trả lời

11

Bạn có thể sử dụng thông điệp WM_GETMINMAXINFO để lưu trạng thái của cửa sổ và sau đó sử dụng thông điệp WMSize để kiểm tra nếu cửa sổ được tối đa hóa.

trong bạn tạo tuyên bố xử lý mesage như vậy:

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

Và xử lý như thế này:

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

Bạn sẽ không bị cháy quá muộn? (* sau * biểu mẫu được phóng to). – kobik

+1

@kobik, Có thông báo này kích hoạt sau khi tối đa hóa, OP có thể sử dụng 'WM_GETMINMAXINFO' để lưu trạng thái và sau đó sử dụng' WMSize' để kiểm tra xem cửa sổ đã được phóng to hay chưa. – RRUZ

7

WIN + UP không tạo ra WM_SYSCOMMAND thông điệp, đó là lý do tại sao bạn không thể bắt họ. Tuy nhiên, nó tạo ra các thông báo WM_GETMINMAXINFO, WM_WINDOWPOSCHANGING, WM_NCCALCSIZE, WM_MOVE, WM_SIZEWM_WINDOWPOSCHANGED. Giống như RRUZ đã nói, hãy sử dụng WM_GETMINMAXINFO để phát hiện khi nào hoạt động tối đa sắp bắt đầu và WM_SIZE để phát hiện khi kết thúc.

7

IMO, Bạn không thể sử dụng WM_GETMINMAXINFO để "phát hiện khi một hoạt động tối đa hóa là sắp bắt đầu" như @Remy đã nêu.

In-thực tế thông điệp duy nhất mà có thể là WM_SYSCOMMAND với Msg.CmdType=SC_MAXIMIZE hoặc không có giấy tờ SC_MAXIMIZE2 = $F032 - nhưng nó không được gửi qua Win+UP, hoặc bằng cách sử dụng ShowWindow(Handle, SW_MAXIMIZE) ví dụ.

Cách duy nhất tôi có thể phát hiện một cửa sổ sắp được tối đa là thông qua WM_WINDOWPOSCHANGING mà là bắn ngay sau khi 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; 
Các vấn đề liên quan