上一篇:TWebBrowser直接读写HTML源码
下一篇:Delphi组件开发-在窗体标题栏添加按钮

Delphi使用WM_SYSCOMMAND消息

发布于: 2012-12-16 15:16:40   |  发布在: Delphi文章   |  点击:

当用户从窗口菜单选择一个命令或当用户选择最大化按钮,最小化按钮,复原按钮或关闭按钮时,一个窗口将会接收该(WM_SYSCOMMAND)消息,用户可拦截该消息在响应该消息时做一些其他的操作。

 参数

wParam:指定系统命令的类型。它可取以下值:

SC_CLOSE 关闭窗口 
SC_HOTKEY Activate the window associated with the application-specified hot key. 
SC_HSCROLL Scroll horizontally. 
SC_KEYMENU Retrieve a menu through a keystroke. 
SC_MAXIMIZE 最大化窗口
SC_MINIMIZE 最小化窗口. 
SC_MOUSEMENU Retrieve a menu through a mouse click. 
SC_MOVE Move the window. 
SC_NEXTWINDOW Move to the next window. 
SC_PREVWINDOW Move to the previous window. 
SC_RESTORE Save the previous coordinates (checkpoint). 
SC_SCREENSAVE 激活屏幕保护程序. 
SC_SIZE Size the window. 
SC_TASKLIST 激活开始菜单. 
SC_VSCROLL Scroll vertically. 
SC_MONITORPOWER 关闭显示器(LPARAM为非0参数)
SC_SEPARATOR 
SC_CONTEXTHELP 显示帮助
SC_DEFAULT
SC_SIZE = $F000
SC_MOVE = $F010
SC_MINIMIZE = $F020
SC_MAXIMIZE = $F030
SC_NEXTWINDOW = $F040
SC_PREVWINDOW = $F050
SC_CLOSE = $F060
SC_VSCROLL = $F070
SC_HSCROLL = $F080
SC_MOUSEMENU = $F090
SC_KEYMENU = $F100
SC_ARRANGE = $F110
SC_RESTORE = $F120
SC_TASKLIST = $F130
SC_SCREENSAVE = $F140
SC_HOTKEY = $F150
SC_DEFAULT = $F160
SC_MONITORPOWER = $F170
SC_CONTEXTHELP = $F180
SC_SEPARATOR = $F00F

有的时候我们看到一些这里没有的命令,比如用鼠标拖动控件时用的panel1.Perform(WM_SYSCOMMAND, $F012, 0);这个$F012这个命令在定义里没有,其实它是SC_MOVE or 2的结果,微软的文档中提到WM_SYSCOMMAND命令中wParam的值的低4位值是保留的。

lParam:如果一个窗口命令被鼠标选中,低位字指定光标的水平位置。否则该参数不被使用。如果一个窗口命令被鼠标选中,高位字指定光标的垂直位置。如果使用系统加速键选择的命令,则该参数为-1,如果使用助记符的话,则该参数为0。

返回值
   如果成功处理该消息,则返回值为0。

举例说明:
1. 在Form的MouseDown事件里写如下代码
ReleaseCapture;
Perform(WM_SYSCOMMAND, SC_SIZE OR 1, 0); // Left
Perform(WM_SYSCOMMAND, SC_SIZE OR 2, 0); // Right
Perform(WM_SYSCOMMAND, SC_SIZE OR 3, 0); // Top
Perform(WM_SYSCOMMAND, SC_SIZE OR 4, 0); // left-top
Perform(WM_SYSCOMMAND, SC_SIZE OR 5, 0); // Right-top
Perform(WM_SYSCOMMAND, SC_SIZE OR 6, 0); // bottom
Perform(WM_SYSCOMMAND, SC_SIZE OR 7, 0); // left-bottom
Perform(WM_SYSCOMMAND, SC_SIZE OR 8, 0); // right-bottom

2. 在Panel1控件的MouseDown事件里写入以下代码,可以达到拖动该Panel1控件而移动整个窗体的效果
procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  ReleaseCapture;
  Perform(wm_SysCommand,$F012,0);
end;

消息