怎样把程序最小化到托盘上?我现在的麻烦是按下最小化按钮之后根本就不能最小化到托盘上,procedure InstIcon(ToyIcon:TIcon;WinHandle:THandle;cbMessage:Integer);
begin
IconData.cbSize:=Sizeof(IconData);
IconData.Wnd:=WinHandle;
IconData.uID:=ICON_ID;
IconData.uFlags:=NIF_MESSAGE or NIF_ICON or NIF_TIP;
IconData.uCallbackMessage:=cbMessage;
IconData.hIcon:=ToyIcon.Handle;
IconData.szTip:='LavaTech--Enhance the life!';
Shell_NotifyIcon(NIM_ADD,@IconData);
end;
除了上面的代码还用什么?
begin
IconData.cbSize:=Sizeof(IconData);
IconData.Wnd:=WinHandle;
IconData.uID:=ICON_ID;
IconData.uFlags:=NIF_MESSAGE or NIF_ICON or NIF_TIP;
IconData.uCallbackMessage:=cbMessage;
IconData.hIcon:=ToyIcon.Handle;
IconData.szTip:='LavaTech--Enhance the life!';
Shell_NotifyIcon(NIM_ADD,@IconData);
end;
除了上面的代码还用什么?
解决方案 »
- 在新生注册的时候,往数据库加入数据出错了,不知道为什么.
- Indy10的IdTCPServer和IdTCPClient
- 救命!!!!
- query_cbtyt not in cached update mode ???
- 怪哉
- 开仓放分了!谁知道TQuery的超时是见在哪设,怎么设?
- 请各位高手发表高见——《成大事的先决条件是什么?》
- tiodthread.create(query6,query7,datasource7,datasource8);在主线程中调用前面这个线程时为何出错!?提示:QUERY与DATASOURCE是不兼容的类型?
- 关于TreeView编程,有得学!!!
- 如何生成书签文件*.URL
- DUnit的原理是什么,如何来测试单元??
- SOS: tinyint类型在ClientDataSet的Filter中的问题
WM_BARICON=WM_USER+200;
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 :=application.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;
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 :=application.Icon.Handle;
//Form1.Icon.Handle;//LoadIcon(Form1.Handle,'TRANS.ICO');//Form1.Icon.Handle;
lpData.uCallbackMessage := WM_BARICON;
lpData.uID :=0;
lpData.szTip := '查询服务器';
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;
CM_RESTORE = WM_USER + $1000; {自定义的“恢复”消息}
WZGL_APP_NAME = 'demo';const
WM_WZGLNOTIFY = WM_USER + 100; //自定义消息
strNotifytip = '状态栏程序Demo'; //状态区的提示信息
ID_MAIN = 100; // 定义图标的ID public
function AddIcon(hwnd: HWND): Boolean; //在状态区添加图标
function RemoveIcon(hwnd: HWND): Boolean; //从状态区移去图标
procedure Notify(var Msg: TMessage); message WM_WZGLNOTIFY;
//自定义消息处理函数
procedure minimize(sender: Tobject);
//定义最小化过程,赋给Application.OnMinimize;
procedure CreateParams(var Params: TCreateParams); override;
procedure RestoreRequest(var message: TMessage); message CM_RESTORE;
{ Public declarations }
var
Frm_StatebarDemo: TFrm_StatebarDemo;
nid: NOTIFYICONDATA;
i: integer;
procedure TFrm_StatebarDemo.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.WinClassName := WZGL_APP_NAME;
end;{处理“恢复”消息}procedure TFrm_StatebarDemo.RestoreRequest(var message: TMessage);
begin
if IsIconic(Application.Handle) = True then //窗体是否最小化
Application.Restore //恢复窗体
else
Application.BringToFront; //提到前面显示 把最后的活动窗体放在其余的应用程序之上
end;//在状态区添加图标function TFrm_StatebarDemo.AddIcon(hwnd: HWND): Boolean;
begin
nid.cbSize := sizeof(NOTIFYICONDATA);
nid.Wnd := hwnd;
nid.uID := ID_MAIN; //const ID_MAIN=100 状态栏图标ID
nid.uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
nid.uCallbackMessage := WM_WZGLNOTIFY;
nid.hIcon := LoadIcon(hInstance, 'MAINICON');
strCopy(nid.szTip, strNotifyTip);
AddIcon := Shell_NotifyIcon(NIM_ADD, @nid);
end;
//从状态区移去图标function TFrm_StatebarDemo.RemoveIcon(hwnd: HWND): Boolean;
var
nid: NOTIFYICONDATA;
begin
nid.cbSize := sizeof(NOTIFYICONDATA);
nid.Wnd := hwnd;
nid.uID := ID_MAIN;
nid.uFlags := 0;
RemoveIcon := Shell_NotifyIcon(NIM_DELETE, @nid);
end;//自定义消息处理函数procedure TFrm_StatebarDemo.Notify(var Msg: TMessage);
var
Pt: TPoint;
begin
case msg.LParam of
WM_RBUTTONDOWN: //当点击右键时,弹出快捷菜单
begin
SetForeGroundWindow(nid.wnd);
GetCursorPos(Pt);
Popupmenu.Popup(pt.x, pt.y);
end;
end;
end;//定义最小化过程,赋给Application.OnMinimize;procedure TFrm_StatebarDemo.minimize(sender: Tobject);
begin
AddIcon(handle);
ShowWindow(Application.handle, sw_hide)
end;procedure TFrm_StatebarDemo.FormDestroy(Sender: TObject);
begin
RemoveIcon(handle);
end;
一切过程都是封装好了的~
然后参照楼上的OnMinimize事件的代码
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, shellapi, Menus, ExtCtrls;
const
TrayIconID = 1;
CM_TRAYICON=WM_USER+1001;
type
TForm1 = class(TForm)
PopupMenu1: TPopupMenu;
Timer1: TTimer;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure N1Click(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
FIcon: TIcon;
Flag: Boolean;
nid: TNotifyIconData;
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
FIcon := TIcon.Create;
FIcon.Handle := LoadIcon(HInstance, 'MainIcon' );
if FIcon.Handle = 0 then
begin
MessageDlg('无法打开图标!', mtError, [mbok], 0);
Application.Terminate;
exit;
end; with nid do
begin
cbSize := sizeof(TNotifyIconData);
Wnd := Handle;
uID := TrayIconID;
uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
uCallbackMessage := CM_TRAYICON;
hIcon := FIcon.Handle;
StrPCopy(szTip, '这是一个测试程序!')
end;
Shell_NotifyIcon(NIM_ADD, @nid);
SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Shell_NotifyIcon(NIM_DELETE, @nid);
FIcon.Free;
end;procedure TForm1.N1Click(Sender: TObject);
begin
MessageDlg('这是一个测试程序!', mtInformation, [mbOK], 0);
end;procedure TForm1.N2Click(Sender: TObject);
begin
close;
end;procedure TForm1.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled := false;
if Flag = false then
if Visible then
Hide
else
Show;
end;procedure Tform1.MessageHandler(var msg: TMessage);
var
Point: TPoint;
begin
if msg.WParam = TrayIconID then
case msg.LParam of
WM_LBUTTONDOWN:
begin
with Timer1 do
begin
Enabled := true;
Interval := GetDoubleClickTime;
end;
end;
WM_LBUTTONDBLCLK:
begin
Flag := true;
MessageDlg('这是一个测试程序!', mtInformation, [mbok], 0);
Flag := false;
end;
WM_RBUTTONDOWN:
begin
GetCursorPos(Point);
PopupMenu1.Popup(Point.X, Point.Y);
end;
end;
end;end.
最简单好用http://lysoft.7u7.net