2012-03-14 2 views
8

폼이 최대화되어 특정 설정 (크기 또는 위치와 관련 없음)을 저장하고 크기와 위치를 약간 수정하려는 경우를 감지하고 싶습니다. 그것을 할 보편적 인 방법이 있습니까? this article과 같은 WM_SYSCOMMAND 메시지를 잡으려고했습니다. 그것은 최대화 버튼에 의해 메뉴에서 최대화를 위해 잘 작동하지만 WIN + UP 키 스트로크를 누르면 해고되지 않습니다. 누구든지 WIN + UP 키 스트로크를 사용하여 최대화 이벤트를 잡는 보편적 인 방법을 알고 있습니까?양식을 최대화 할 때를 감지하는 방법은 무엇입니까?

감사

+4

당신은'WM_GETMINMAXINFO'를 처리 할 수 ​​있습니다. – 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_GETMINMAXINFO, WM_WINDOWPOSCHANGING, WM_NCCALCSIZE, WM_MOVE, WM_SIZEWM_WINDOWPOSCHANGED 메시지를 생성합니다. RRUZ와 마찬가지로 을 사용하면 최대화 작업이 시작될 때를 감지하고 WM_SIZE을 완료하면 감지합니다. @Remy이 명시된 바와 같이 "는 최대화 작업이을 시작하기에 대한 을 때 감지"

7

IMO, 당신은 할 WM_GETMINMAXINFO을 사용할 수 없습니다. 하지만이 Win+UP를 통해, 또는 예를 들어 ShowWindow(Handle, SW_MAXIMIZE)를 사용하여 전송되는 아니에요 - 수는 Msg.CmdType=SC_MAXIMIZE 또는 문서화되지 않은 SC_MAXIMIZE2 = $F032WM_SYSCOMMAND입니다

에서-사실 유일한 메시지. 나는 창을 최대화하는 것입니다 감지 할 수

있는 유일한 방법은 WM_GETMINMAXINFO 후 바로 해고되는 WM_WINDOWPOSCHANGING 경유 :

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; 
관련 문제