我需要在用户通过双击标题栏恢复表单时进行处理。我尝试处理WM_SYSCOMMAND窗口消息但是这只有在用户通过单击系统菜单中的恢复按钮来恢复表单时才有效。
如果这很重要,我正在使用DevExpress功能区表单。
感谢。
答案 0 :(得分:6)
我认为你的意思是双击标题栏,因为双击系统菜单会关闭表格 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)
问题是Windows.pas中 CmdType const SC_RESTORE2 = 61730 // 0xF122 缺少。
请参阅下面的工作代码:
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#中的值”部分)
答案 1 :(得分:2)
如果有人稍后在搜索中发现此内容......
问题不在于Windows.pas中缺少任何内容,因为SC_RESTORE2不应该在那里。正如Rob Kennedy所指出的,SC_RESTORE2值也不在WinUser.h中。问题是François的示例代码(可能是James'代码)无法按位 - 而wParam(Message.CmdType)则为$ FFF0。这在François的更新链接中有所描述,并且在“C#中的值”社区内容中也有说明,它甚至说不使用SC_RESTORE2。请注意,SC_RESTORE2和$ FFF0 = SC_RESTORE。