使用WM_SYSCOMMAND的SC_MINIMIZE和SC_RESTORE消息,
但是这个无法截获在任务栏的窗口标题点右键最小化的消息,
也无法捕获直接单击任务栏窗口标题使窗口最小化及还原的消息.
请问如何捕获这类消息.
但是这个无法截获在任务栏的窗口标题点右键最小化的消息,
也无法捕获直接单击任务栏窗口标题使窗口最小化及还原的消息.
请问如何捕获这类消息.
调试欢乐多
begin
if msg.WParam = SC_MINIMIZE then
ShowMessage('ok');
end;
const
WM_TRAYNOTIFY=WM_USER+1;//定义通知消息
...
private
{ Private declarations }
procedure SysCommand(var SysMsg: TMessage); message WM_SYSCOMMAND; //托盘
procedure WMNID(var msg:TMessage); message WM_TRAYNOTIFY; //托盘操作
...
var
FrmLogin: TFrmLogin;
nd0 :NotifyIconData; //托盘
implementation{$R *.dfm}
procedure TFrmLogin.SysCommand(var SysMsg: TMessage);
begin
if (SysMsg.WParam = SC_MINIMIZE) or (SysMsg.WParam = SC_CLOSE) then // 当最小化与关闭 时
begin
SetWindowPos(Application.Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_HIDEWINDOW);
Hide; // 在任务栏隐藏程序
// 在托盘区显示图标
with nd0 do
begin
cbSize := SizeOf(TNotifyIconData);
Wnd := Handle;
uID := 0;
uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
uCallBackMessage := WM_TRAYNOTIFY;
hIcon := Application.Icon.Handle;
szTip := csMainRitle;
end;
Shell_NotifyIcon(NIM_ADD, @nd0); // 在托盘区显示图标
end
else
inherited;
//end;
end;Procedure TFrmLogin.WMNID(var msg:TMessage); //托盘操作
var
mousepos: TPoint;
begin
GetCursorPos(mousepos); //获取鼠标位置
case msg.LParam of WM_LBUTTONUP: // 在托盘区点击左键后 begin Self.Visible := not Self.Visible; // 显示主窗体与否 Shell_NotifyIcon(NIM_DELETE, @nd0); // 显示主窗体后删除托盘区的图标 SetWindowPos(Application.Handle, HWND_TOP, 0, 0, 0, 0, SWP_SHOWWINDOW); // 在任务栏显示程序 end; WM_RBUTTONUP: pm1.Popup(mousepos.X, mousepos.Y); // 弹出菜单
end;
end;
任务栏的窗口是Application,有区别于窗体的Form,所以,你要截获Application的消息才行,最简单的就是添加一个ApplicationEvents组件在窗体,然后处理其OnMinimize事件和OnRestore事件即可。
学习了