一般软件运行时会在任务栏上生成一个"长方框的窗体"(真不好启齿,都不知这个得称为什么),请问要怎么办
才能够捕获用户点击了该窗体的事件?
另外请问,如果我有一个窗体的语柄,请问我得发送什么消息才能实现将这个窗体最小化或还原呢?
望请解答,万分感谢!!
才能够捕获用户点击了该窗体的事件?
另外请问,如果我有一个窗体的语柄,请问我得发送什么消息才能实现将这个窗体最小化或还原呢?
望请解答,万分感谢!!
procedure TForm1.Button3Click(Sender: TObject);
var
h: hwnd;
begin
h := FindWindow(nil,'MD5');
if h <> 0 then
showwindow(h,SW_MINIMIZE);
end;
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,ShellAPI;
const
WM_BARICON=WM_USER+200;
private
procedure WMSysCommand(var
Message: TMessage); message WM_SYSCOMMAND;
procedure WMBarIcon(var
Message:TMessage);message WM_BARICON;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.WMSysCommand
(var Message:TMessage);
var
lpData:PNotifyIconData;
begin
if Message.WParam = SC_ICON then
begin
//如果用户最小化窗口则将窗口
隐藏并在任务栏上添加图标
lpData := new(PNotifyIconDataA);
lpData.cbSize := 88;
//SizeOf(PNotifyIconDataA);
lpData.Wnd := Form1.Handle;
lpData.hIcon := Form1.Icon.Handle;
lpData.uCallbackMessage := WM_BARICON;
lpData.uID :=0;
lpData.szTip := 'Samples';
lpData.uFlags := NIF_ICON
or NIF_MESSAGE or NIF_TIP;
Shell_NotifyIcon(NIM_ADD,lpData);
dispose(lpData);
Form1.Visible := False;
end
else
begin
//如果是其它的SystemCommand
消息则调用系统缺省处理函数处理之。
DefWindowProc(Form1.Handle,Message.
Msg,Message.WParam,Message.LParam);
end;
//
end;
procedure TForm1.WMBarIcon(var Message:TMessage);
var
lpData:PNotifyIconData;
begin
if (Message.LParam = WM_LBUTTONDOWN) then
begin
//如果用户点击任务栏图标则将图标删除并回复窗口。
lpData := new(PNotifyIconDataA);
lpData.cbSize := 88;//SizeOf(PNotifyIconDataA);
lpData.Wnd := Form1.Handle;
lpData.hIcon := Form1.Icon.Handle;
lpData.uCallbackMessage := WM_BARICON;
lpData.uID :=0;
lpData.szTip := 'Samples';
lpData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
Shell_NotifyIcon(NIM_DELETE,lpData);
dispose(lpData);
Form1.Visible := True;
end;
end;
end.
//先用image editor编辑一个图表文件加到工程中命名为trayicon
下面程序
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,shellapi, Menus;
const
//定义用到的图标的ID
TrayIconId=1;
//定义向应用程序发送的消息类型
CM_TRAYICON=WM_USER+1001;
type
TForm1 = class(TForm)
PopupMenu1: TPopupMenu;
test11: TMenuItem;
test21: TMenuItem;
test31: TMenuItem;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
//程序图标
AppIcon:TIcon;
//定义一个TNotifyIconData类型的变量,通过操作它来完成程序图标的设置
nid:TNOtifyIconData;
//cm_tryaicon的消息处理过程
procedure MessageHandler(var msg : TMessage); message CM_TRAYICON;
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
//将trayicon调用到程序中,如果失败终止程序
appicon:=Ticon.Create;
appicon.Handle:=loadIcon(hinstance,'trayicon');
if appicon.Handle=0 then
begin
messagebox(handle,'不能打开图标文件!','提示',mb_ok);
application.Terminate;
exit;
end;
//将nid数据结构初始化
with nid do
begin
cbsize:=sizeof(tnotifyicondata);
wnd:=handle;
uId:=trayiconid;
uflags:=NIF_MESSAGE OR NIF_ICON OR NIF_TIP;
UCALLBACKMESSAGE:=0;
hicon:=appicon.Handle;
strpcopy(sztip,'the test app');
end;
//加载图标
shell_notifyicon(NIM_ADD,@nid);
end;
procedure tform1.MessageHandler(var msg:tmessage);
var
point:TPoint;
begin
//判断收到消息是不是由trayicon发出如果是
if msg.WParam=trayiconid then //判断消息类型 做出相应处理
case msg.LParam of
//鼠标双击
WM_LBUTTONDBLCLK:
begin
//如果显示则隐藏,如果隐藏则显示
if visible then
hide
else
show;
end;
//右键单击
WM_RBUTTONUP :
begin
//用API函数getcursorpos将鼠标当前坐标写到定义的point结构中
GetCursorPos(point);
//弹出菜单
popupmenu1.Popup(point.X,point.y);
end;
end;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//推出程序时候删除任务栏的图标
shell_notifyicon(NIm_delete,@nid);
appicon.Free;
end;end.