【问题标题】:Delphi 2009 - Handle when window is restored via double clicking the SysMenu?Delphi 2009 - 通过双击 SysMenu 恢复窗口时的处理?
【发布时间】:2009-09-23 16:21:10
【问题描述】:

当用户通过双击标题栏恢复表单时,我需要处理。我尝试处理 WM_SYSCOMMAND 窗口消息,但这仅在用户通过单击系统菜单中的恢复按钮恢复表单时才有效。

如果这很重要,我正在使用 DevExpress 功能区表单组件。

谢谢。

【问题讨论】:

    标签: delphi delphi-2009 devexpress vcl window-messages


    【解决方案1】:

    我认为您的意思是双击标题栏,因为双击系统菜单会关闭表单。
    WM_SYSCOMMAND 应该可以工作,因为双击标题栏恢复表单时的消息顺序是:

    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)
    

    问题是 CmdType const SC_RESTORE2 = 61730 //0xF122 在 Windows.pas 中缺失

    查看下面的工作代码:

    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;
    

    更新:从WM_SYSCOMMAND Notification on MSDN 引用SC_RESTORE2(参见“C# 中的值”部分)

    【讨论】:

    • 缺少 Windows.pas 吗? WinUser.h 中显然也缺少它。该标志在哪里命名和记录?
    • 对于任何不想关注链接的人:SC_RESTORE 在从任务栏恢复时发送。 SC_RESTORE2 具有不同的值,并且在通过双击标题栏进行恢复时专门发送。这在我看来好像 SC_RESTORE2 是最近引入的通知,并且可能并非所有 Windows 版本都支持它。有关该主题的一般文档根本没有提到 SC_RESTORE2,也没有说明哪些 Windows 版本可能支持或可能不支持它。
    • @Deltics,我在 Windows XP (x32)、Vista (x32/x64)、7 中测试了它,它工作正常 :)
    【解决方案2】:

    万一以后有人在搜索中找到这个...

    问题不在于 Windows.pas 中缺少任何内容,因为 SC_RESTORE2 不应该存在。正如 Rob Kennedy 所指出的,SC_RESTORE2 值也不在 WinUser.h 中。问题是 François 的示例代码(可能是 James 的代码)无法按位进行,而 wParam (Message.CmdType) 则为 $FFF0。这在 François 的更新链接中有所描述,并且在“C# 中的值”社区内容中也有说明,其中甚至说 not 使用 SC_RESTORE2。请注意 SC_RESTORE2 和 $FFF0 = SC_RESTORE。

    【讨论】:

    • 你能说出低字节包含什么吗?
    猜你喜欢
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多