如何将程序最小化至系统托盘并可通过热键击活?

cncaoyan 2001-07-30 11:40:01
如何将程序最小化至系统托盘并可通过热键击活?

最好能够提供源代码或详细方法(我是个新手)


...全文
197 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Judas 2001-07-30
  • 打赏
  • 举报
回复
老问题了……

建立托盘图标——
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
AppEvnts, ShellAPI, Menus;

const
my_message=wm_user+24; //定义消息

type
TForm1 = class(TForm)
ApplicationEvents1: TApplicationEvents;
PopupMenu1: TPopupMenu;
AAA1: TMenuItem;
BBB1: TMenuItem;
N1: TMenuItem;
procedure InstallIcon;
procedure OnMymssg(var msg : Tmessage);message my_message;
procedure ApplicationEvents1Minimize(Sender: TObject);
procedure N1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
nid:Tnotifyicondataa;
implementation

{$R *.DFM}

procedure Tform1.InstallIcon;
begin
nid.cbsize:=sizeof(nid);
nid.wnd:=handle;
nid.uid:=0;
nid.hIcon:=Application.icon.handle;
nid.sztip:='这里是你的提示信息!';
nid.uCallBackMessage:=my_message;
nid.uflags:=nif_icon or nif_tip or nif_message;
shell_notifyIcon(NIM_ADD,@nid);
end;

procedure Tform1.OnMymssg(var msg : Tmessage);
var
mou:Tmouse;
begin
mou:=Tmouse.Create;
try
if msg.LParam=WM_LBUTTONUP then
begin
form1.Visible:=true;
setforegroundwindow(form1.handle);
OpenIcon(Application.Handle);
shell_notifyicon(NIM_DELETE,@nid);
end
else if msg.LParam=WM_RBUTTONUP then
PopupMenu1.Popup(mou.CursorPos.x,mou.cursorpos.y);
finally
mou.Free;
end;
end;

procedure TForm1.ApplicationEvents1Minimize(Sender: TObject);
begin
installicon;
form1.Hide;
end;

procedure TForm1.N1Click(Sender: TObject);
begin
Close;
end;

end.


注册系统热键——(要在USES里加上registry)

//注册热键(ctrl、alt和A)
RegisterHotKey(handle,0,MOD_ALT or MOD_CONTROL,Ord('A'));

//当按下定义好的热键时,窗口弹出,并成为当前激活窗口
procedure TForm1.WMHOTKEY(var Message:TMessage);
begin
Form1.Visible:=True;
Setforegroundwindow(form1.handle);
OpenIcon(Application.Handle);
Shell_notifyicon(NIM_DELETE,@nid);
end;


够详细了吧?给分吧
jingpingyi 2001-07-30
  • 打赏
  • 举报
回复
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Menus, ShellAPI, RXShell, StdCtrls;

const
CM_TRAYICON = CM_BASE + 100; //定义发送的休息

type
TForm1 = class(TForm)
PopupMenu1: TPopupMenu;
RestoreItem: TMenuItem;
ExitItem: TMenuItem;
ShowBtn: TButton;
N1: TMenuItem;
HelloItem: TMenuItem;
procedure RestoreItemClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure ExitItemClick(Sender: TObject);
procedure HelloItemClick(Sender: TObject);
private
procedure MyMinimize(Sender: TObject);
procedure CMTrayIcon(var Message: TMessage); message CM_TRAYICON;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
IconData: TNotifyIconData; //图标

implementation

{$R *.DFM}

//处理 CM_TRAYICON 的事件
procedure TForm1.CMTrayIcon(var Message: TMessage);
var
P: TPoint;
begin
try
with Message do
//如果单击鼠标左键或右键,弹出菜单
if (lParam = WM_LBUTTONUP)or(lParam = WM_RBUTTONUP) then
begin
GetCursorPos(P);
PopupMenu1.Popup(P.X, P.Y);
end;
except

end;
end;

//系统最小化时调用的事件
procedure TForm1.MyMinimize(Sender: TObject);
begin
Hide;
end;

procedure TForm1.RestoreItemClick(Sender: TObject);
begin
Application.MainForm.Show;

Application.Restore; //恢复窗口
// 必须先 MainForm.Show,然后 Restore ,
// 要不再次 Hide Form 时 将会失败!
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//删除图标
Shell_NotifyIcon(NIM_DELETE, @IconData);
IConData.cbSize := 0;
Application.OnMinimize := nil;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin

Application.OnMinimize := MyMinimize; //调用最小化过程

with IconData do
begin
cbSize := SizeOf(IconData); //结构大小
Wnd := Form1.Handle; //接收CM_TRAYICON消息的窗口HWN
uID := $DEDB; //TrayIcon的编号
uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
hIcon := Forms.Application.Icon.Handle; //指定ICON
uCallbackMessage := CM_TRAYICON; //要发送的消息
StrCopy(szTip, PChar(Caption));
end;
Shell_NotifyIcon(NIM_Add, @IconData); //添加图标
// ShellAPI.pas
end;

procedure TForm1.ExitItemClick(Sender: TObject);
begin
Close;
end;

procedure TForm1.HelloItemClick(Sender: TObject);
begin
ShowMessage('Hello! 你好吗?');
end;

end.
sunwk 2001-07-30
  • 打赏
  • 举报
回复
给你个例子(建立托盘图标):

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Menus,shellapi, AppEvnts;
const
ICON_ID = 1; // 图标在本应用程序中的编号
MI_ICONEVENT = WM_USER + 1; // 图标上的鼠标事件

type
TForm1 = class(TForm)
Pop1: TPopupMenu;
status1: TMenuItem;
n1: TMenuItem;
close1: TMenuItem;
ApplicationEvents1: TApplicationEvents;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure close1Click(Sender: TObject);
procedure status1Click(Sender: TObject);
procedure n1Click(Sender: TObject);
procedure ApplicationEvents1Minimize(Sender: TObject);
private
{ Private declarations }
normalicon, disabledicon: TIcon; //需放在状态指示区的图标
status: Boolean;
procedure InstallIcon; //在状态指示区上安装图标
procedure ChangeIcon(status:Boolean);//根据参数,显示不同的图标
procedure UnInstallIcon; //卸载图标
procedure IconOnClick(var message: TMessage); message MI_ICONEVENT; //响应图标上的鼠标事件
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
InstallIcon;
ChangeIcon(False);
Application.Minimize;
end;

procedure TForm1.InstallIcon;
var IconData: TNotifyIconData;
begin
normalicon := TIcon.Create;
disabledicon := TIcon.Create;
normalicon.LoadFromFile( 'normal.ico' );
disabledicon.LoadFromFile( 'disable.ico' );
IconData.cbSize := SizeOf( IconData );
IconData.Wnd := Handle;
IconData.uID := ICON_ID;
IconData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
IconData.uCallBackMessage := MI_ICONEVENT;
IconData.hIcon := normalicon.Handle;
IconData.szTip := '我可以在状态指示区上加图标了!';
Shell_NotifyIcon( NIM_ADD, @IconData );
end;

procedure TForm1.ChangeIcon( status: boolean );
var IconData: TNotifyIconData;
begin
IconData.cbSize := SizeOf(IconData);
IconData.wnd := Handle;
IconData.uID := ICON_ID;
{if IconData.fconectado then}
IconData.hIcon :=normalicon.Handle;
{ else
IconData.hIcon :=disabledIcon.Handle;}
IconData.uFlags := NIF_ICON;
Shell_NotifyIcon(NIM_MODIFY, @IconData);
end;

procedure TForm1.UnInstallIcon;
var IconData: TNotifyIconData;
begin
IconData.cbSize := SizeOf( IconData );
IconData.Wnd := Handle;
IconData.uID := ICON_ID;
Shell_NotifyIcon( NIM_DELETE, @IconData );
end;

procedure TForm1.IconOnClick( var message: Tmessage);
var p : TPoint;
begin
if (message.lParam = WM_LBUTTONDOWN) then
ShowWindow( Application.Handle, SW_SHOW );
if (message.lParam = WM_RBUTTONDOWN) then
begin
GetCursorPos( p );
pop1.Popup( p.x ,p.y );
ChangeIcon( status );
end;
end;



procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
UnInstallIcon;
normalicon.Free;
disabledicon.Free;
end;

procedure TForm1.close1Click(Sender: TObject);
begin
Close;
end;

procedure TForm1.status1Click(Sender: TObject);
begin
status := not status;
if status then
status1.Caption := 'Enable'
else
status1.Caption := 'Disable';
end;

procedure TForm1.n1Click(Sender: TObject);
begin
Application.Restore;
Application.BringToFront;
end;

procedure TForm1.ApplicationEvents1Minimize(Sender: TObject);
begin
ShowWindow(Application.Handle, SW_HIDE);
end;

end.
xiaonanw 2001-07-30
  • 打赏
  • 举报
回复
注意,我上面说的是如何注册系统热键,里面没有建立托盘图标的代码。
xiaonanw 2001-07-30
  • 打赏
  • 举报
回复
先声明以私有过程
private
procedure wmhotkey(var msg:tmessage);message wm_hotkey; //以下程序是windows在任何情况下都相应热键

procedure tform1.formcreate(sender.....);
begin
registerhotkey(handle,1002,0,vk_f10);//注册F10为热键
registerhotkey(handle,1003,mod_control,65);//注册ctrl+a
registerhotkey(handle,1004,mod_control+mod_alt,ord('a'));//注册ctrl+alt+a
registerhotkey(handle,1001,mod_win,65);//注册win+a,win 就是ctrl和alt中间的键
end

procedure tform1.wmhotkey(var msg:tmessage);
begin
if msg.wparam=1001 then
//自己写事件

procedure tform1.formdestroy(sender:tobject);
begin
unregisterhotkey(handle,1001);//释放注册的热键
end;
newyj 2001-07-30
  • 打赏
  • 举报
回复
用控件很好实现
rxlib里有;也有专门的托盘控件
www.inprises.com 有
去年应朋友需要用C# 2.0写的一个按键模拟鼠标单击操作程序,类似按键精灵,翻出来分享 实现功能:设定模拟鼠标单击/秒次的系统键(键自动保存),设定每秒单击的间隔毫秒数,按下设定好的程序便开始模拟鼠标单击操作,再按一次程序停止模拟并统计模拟鼠标单击的次数与时间误差。 演示程序:\HookSimulateMouse\bin\Debug\HookSimulateMouse.exe(需MS .NET Framework 2.0运行库支持) 程序界面: 1.设定时间间隔范围:1ms-1000ms,如:900ms 2.设置快捷键,如:Ctrl+Alt+W 将鼠标移至要模拟单击处按键,于下一秒开始后计时,windowsXP不是实时系统,系统时间误差在20-55ms,而且通过程序获得(特别在CPU占用率高时)都会有延迟,要高精度需要凋API或者取CPU时钟频率,还要计算开机以来运行时长ms数,而且那是计时不是定时。 如:您设定系统时间ms数为900,于5点18分20秒569毫秒按下了快捷键,程序从下一秒0ms开始计时,在5点18分21秒900-908毫秒之间程序模拟一次鼠标单击(鼠标单击可能有8ms延迟) 以此类推直到您再按一次程序停止模拟并统计单击次数及毫秒误差(1s=1000ms) 按关闭X或双击桌面右下角系统托盘程序图标可隐藏/显示程序界面,至桌面右下角系统托盘 通过本C#程序源码可学习: 程序窗体最大化/最小化还原到系统托盘 调用系统DLL(user32.dll)设定全局键控制程序,模拟鼠标单击操作 调用timer控件计时 Thread线程控制 FileStream文件流读写操作

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧