Search code examples
delphidelphi-2009devexpressvclwindow-messages

Delphi 2009 - Handle when window is restored via double clicking the SysMenu?


I need to handle when the user restores the form by double clicking the title bar. I tried handling the WM_SYSCOMMAND window message however this only works if the user restores the form via clicking the restore button in the system menu.

I am using DevExpress ribbon form components if this matters.

Thanks.


Solution

  • I think you mean double-clicking on the title bar because double clicking on the system menu closes the form.
    WM_SYSCOMMAND should work since the sequence of messages when double-clicking on the title bar to restore the form is:

    Message posted: hwnd=$004E0820 WM_NCLBUTTONDBLCLK wParam $00000002 lParam $000705D4 Process Project1.exe (2380)
    => Message sent: hwnd=$004E0820 WM_SYSCOMMAND restore cmd requested (-44,-44) Process Project1.exe (2380)
    Message sent: hwnd=$004E0820 WM_WINDOWPOSCHANGING wParam $00000000 lParam $0012F4CC Process Project1.exe (2380)
    Message sent: hwnd=$004E0820 WM_GETMINMAXINFO wParam $00000000 lParam $0012EF6C Process Project1.exe (2380)
    Message sent: hwnd=$004E0820 WM_NCCALCSIZE wParam $00000001 lParam $0012F4A0 Process Project1.exe (2380)
    Message sent: hwnd=$004E0820 WM_NCPAINT update region  40040F4B Process Project1.exe (2380)
    Message sent: hwnd=$004E0820 WM_ERASEBKGND wParam $31011DCA lParam $00000000 Process Project1.exe (2380)
    Message sent: hwnd=$004E0820 WM_WINDOWPOSCHANGED wParam $00000000 lParam $0012F4CC Process Project1.exe (2380)
    

    The problem is that the CmdType const SC_RESTORE2 = 61730 //0xF122 is missing in Windows.pas.

    See the working code below:

    type
      TForm7 = class(TForm)
      private
        procedure WMSysCommand(var Message: TWMSysCommand); message WM_SYSCOMMAND;
      end;
    
    var
      Form7: TForm7;
    
    implementation
    
    {$R *.dfm}
    
    { TForm7 }
    
    const
      SC_RESTORE2 = 61730; //0xF122
    
    procedure TForm7.WMSysCommand(var Message: TWMSysCommand);
    begin
      case Message.CmdType of
        SC_RESTORE2 : beep;
      end;
      inherited;
    end;
    

    Update: reference to SC_RESTORE2 from WM_SYSCOMMAND Notification on MSDN (see the "values in C#" part)