怎样才能做出象金山词霸那样(200)(200分)

  • 主题发起人 主题发起人 136566412
  • 开始时间 开始时间
1

136566412

Unregistered / Unconfirmed
GUEST, unregistred user!
怎样才能做出象金山词霸那样,当最小化时放在系统托盘里,而任务兰里没有图标。还有怎样才能
让系统启动里我的软件叶自动启动。
要源码加解释。因为是初学者。200分。
 
//自动启动
procedure TForm1.Button1Click(Sender: TObject);
Var
RegF:TRegistry;
begin
RegF:=TRegistry.Create;
RegF.RootKey:=HKEY_LOCAL_MACHINE;
Try
RegF.OpenKey('SOFTWARE/Microsoft/Windows/CurrentVersion/Run',True);
RegF.WriteString('copymbxfile','E:/mb/exe/mbxcopyp.exe');
except
;
end;
RegF.CloseKey;
RegF.Free;
end;

 
系统托盘可以找控件很多的如trayIcon等等
自动启动如上!
 
我下面这个程序已经贴过一次了,功能是驻留工具栏,同时涉及热键注册相应问题。
放置一个memo和popupmenu就可以了。
unit Unit_Top;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, ExtCtrls,Clipbrd, Menus,ShellApi;
const WM_TrayIcon=WM_User+1;
type
TFrm_Top = class(TForm)
mem_top: TMemo;
pnl_top: TPanel;
bbtn_Copy: TBitBtn;
pm_top: TPopupMenu;
pmi_Exit: TMenuItem;
mmi_Restore: TMenuItem;
procedure FormCreate(Sender: TObject);
procedure pmi_ExitClick(Sender: TObject);
procedure FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
procedure mmi_RestoreClick(Sender: TObject);
private
{ Private declarations }
procedure OnNotifyIcon(var Msg:Tmessage);message WM_TrayIcon;
procedure WMHotkeyHandle(var Msg:TMessage);message WM_HOTKEY;
//响应敏感键按键消息
procedure WMSysCommand(var Msg:TMessage);message WM_SysCommand;
public
{ Public declarations }
end;

var
Frm_Top: TFrm_Top;
implementation
{$R *.DFM}
var iData: TNotifyIconData;
HotkeyId :Integer;
procedure TFrm_Top.WMSysCommand(var Msg:TMessage);
begin
if Msg.WParam=SC_MINIMIZE then
begin
Application.Minimize;
Frm_Top.Hide;
end;
inherited;
end;

procedure TFrm_Top.WMHotkeyHandle(var Msg:TMessage);
begin
if (Msg.LParamHi=$41) and (msg.lparamLo=MOD_CONTROL or mod_Alt) then
begin
Msg.Result:=1;
//该消息已经处理
mmi_RestoreClick(Application);
end;
end;

procedure TFrm_Top.FormCreate(Sender: TObject);
begin
iData.cbSize:=Sizeof(iData);
iData.Wnd:=Frm_Top.Handle;
iData.uID:=0;
iData.uFlags:=NIF_MESSAGE or NIF_ICON or NIF_TIP;
iData.uCallbackMessage:=WM_TrayIcon;
iData.hIcon:=Application.Icon.Handle;
iData.szTip:='asd';
if Shell_NotifyIcon(NIM_ADD, @iData)=False then
ShowMessage('NO');
HotkeyId:=GlobalAddAtom(Pchar('UserDefineHotKey'))-$C000;
//减去$C000是为了保证取值范围的限制
RegisterHotkey(Handle,Hotkeyid,MOD_CONTROL or MOD_Alt, $41);//敏感键为ctrl+Alt+A
end;

procedure TFrm_Top.OnNotifyIcon(var Msg:Tmessage);
var Pos:Tpoint;
begin
case Msg.LParam of
WM_LBUTTONDBLCLK:
mmi_RestoreClick(Application);
WM_RBUTTONDOWN:
begin
GetCursorPos(Pos);
pm_top.Popup (Pos.x,Pos.y);
end;
end;
end;

procedure TFrm_Top.pmi_ExitClick(Sender: TObject);
begin
if Shell_NotifyIcon(NIM_DELETE, @iData)=False then
ShowMessage('NO');
UnRegisterhotkey(Handle,HotkeyId);
DeleteAtom(HotKeyID);
Application.Terminate;
end;

procedure TFrm_Top.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
begin
Frm_Top.Hide;
CanClose:=False;
end;

procedure TFrm_Top.mmi_RestoreClick(Sender: TObject);
begin
Frm_Top.Show;
SetFocus;
end;

end.
 
1:向系统托盘中加入图标控制菜单:
  向系统托盘中加入图标控制菜单须用到函数Shell_NotifyIconA,而这个函数又有
两个参数:'TnotifyIconDataA'结构的参数和一个消息参数即:
Shell_NotifyIconA(dwMessage:DWORD;lpData:PNotifyIconDataA),第一个参数dwMessage
可以是以下值:NIM_ADD:增加一个图标 ;NIM_MODIFY:修改一个已有的图标 ;NIM_DELETE:
删除一个已有的图标 ;
  第二个参数的TnotifyIconDataA结构如下:
TnotifyIconDataA=record
cbSize:DWORD;
{表示该结构的长度}
Wnd:HWND;
{是调用Shell_NotifyIconA函数的窗口的句柄即Handle}
iID:UINT;
{是在下面的uCallbackMessage参数指定的消息中使用的一个自定义数值}
uFlags:UINT;
{决定该结构中的有效部分,如有NIF_MESSAGE则 uCallbackMessage
参数有 效 ;若有NIF_ICON 则hIcon有效;有 NIF_TIP则 szTip参数有效,当然你可
以让这三个参数都有效只须要在这个参数中写成NIF_MESSAGE+NIF_ICON+NIF_TIP即可}
uCallbackMessage:UNIT;
{当添加的图标上有鼠标事件如右击等等时系统向Wnd
参数所指定的窗口发 送消息,这个消息的Msg参数是uCallbackMessage,这个消息的wParam
参数是 uID,这个消息的lParam参数是鼠标事件的 Msg值}
Icon:HICON;
{是出现在系统托盘中的图标的句柄即handle}
szTip:array[0..63] of AnsiChar;
{即delphi是常用的hint即当鼠标停留在
托盘图标上时的提示,例如你可用 ‘这是我的第一个托盘图标菜单’}
end;

[red] 我估计这个函数就可以实现你的功能,可是我还不知道怎么用,如果你会用了,
请告诉我,呵呵 ywx.baby@163.net[/red]
 
1、托盘实现
const
ICON_ID = 1;
MI_ICONEVENT = WM_USER + 1;
//过程定义
private
procedure InstallIcon;
//装图标
procedure UnInstallIcon;
//卸载图标
procedure IconOnClick(var message: TMessage);
//单击图标
message MI_ICONEVENT;
procedure TForm1.IconOnClick(var message: TMessage);
var
p: TPoint;
begin
if (message.LParam = WM_RBUTTONDOWN) then
begin
GetCursorPos(p);
PopupMenu1.Popup(p.X, p.Y);
end;
end;

procedure TForm1.InstallIcon;
var
IconData: TNotifyIconData;
begin
sysTrayIcon := TIcon.Create;
sysTrayIcon := Application.Icon;
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 := sysTrayIcon.Handle;
IconData.szTip := 'Example';
Shell_NotifyIcon(NIM_ADD, @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;

2、任务兰里没有图标:
在FormCreate和FormActivate中写入
ShowWindow(Form1.Handle, SW_HIDE);
ShowWindow(Application.Handle, SW_HIDE);
3、放入启动中
yanlei说的就可以。
 
论坛里面有很多讨论,
你搜索一下可以找到很多,
你给的分太多的。
 
agree
too easy
 
我建议有现成构件可以用的话,最好取而用之。不要在界面上浪费工夫,把时间精力放在
算法和人无我有方面
 
多人接受答案了。
 
后退
顶部