在线等待,立即给分.一个service application ,如何在右下脚显示图标? 我使用了Sheel_NotifyIcon函数.因为service模块没有窗口,为了函数的Handle属性,我加了一个form,Sheel_NotifyIcon在form中调用.结果执行了application.run后程序就崩溃了.请高手指点. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 转的:(其实我还建议你你用控件) 在Delphi中涉及到系统编程的方面毫无例外都要调用API函数,在ShellAPI.pas单元中有要用到的API函数的原型。实战演练:一.新建一个应用程序:File->New Applicaton 在Interface部分定义一个消息常量:const WM_NID=WM_USER+1000; 系统规定从WM_USER开始为用户自定义消息。二.定义一个全局变量: NotifyIcon:TNotifyIconData,NotifyIcon是非常重要的一个变量,整个程序基本上是围着这个变量在转。TNotifyIconData是一个记录类型,按住Ctrl键,在TNotifyIconData 双击即进入ShellAPI.pas单元。(注:在Delphi中,这是一个非常好的对源代码进行分析的方法,源代码说明一切,你要想知道程序背后的内幕,最好的方法就是分析源代码!)此时出现了以下赋值语句:TNotifyIconData = TNotifyIconDataA,这个意思很明显,就是说TNotifyIconData和TNotifyIconDataA是同种数据类型,接着往下看有:TNotifyIconDataA = _NOTIFYICONDATAA,意思与刚才的一样,再往下看: type_NOTIFYICONDATAA = record cbSize: DWORD; Wnd: HWND; uID: UINT; uFlags: UINT; uCallbackMessage: UINT; hIcon: HICON;szTip: array [0..63] of AnsiChar;end;这可真是“千呼万唤始出来,犹抱琵琶半遮面”。现在大家很清楚了,我们刚才定义的全局变量NotifyIcon其实是一个包含有7个成分的记录类型变量,就相当于C/C++中的结构体变量(C/C++的程序员应该是再熟悉不过了)。下面我们逐个来解释记录类型中的7个部分各有什么功能。1> cbSize就是你定义的NotifyIcon变量的大小,用SizeOf(TNotifyIconData)可以取得,如果你是一个熟练的C/C++程序员,你应该不会陌生。在C/C++中,每当要为一个结构体变量分配内存的时候都要:通过 SizeOf(Struct type) 来获知存放一个这样的结构体变量要多少内存。2> Wnd是一个句柄,你希望托盘程序产生的消息有哪个窗体来处理就让Wnd指向那个窗体。例如:你准备在任务栏的托盘小图标上单击时窗体是窗体在“显示”和“隐藏”之间切换,则把Wnd指向主窗体。3> uID:如果你要创建多个托盘小程序,那么怎么区分它们呢?就是靠这个ID号来区分。3> uFlags是一个标志位,它表示当前所创建的托盘程序具有哪些性质:NIF_ICON 表示当前所设置的图标(即hIcon的值)是有效的 NIF_MESSAGE 表示当前所设置的系统消息(即uCallBackMessage的值)是有效的NIF_TIP 表示当前所设置的提示条(即szTip的值)是有效的。4> uCallBackMessage这是7个部分里面最重要的一个。这里指定一个回调消息,也就是说这里定义一个消息名,当你单击或者右击托盘图标的时候就会向你在Wnd所指向的窗体发送一个在uCallBackMessage中定义的消息名,然后你在程序中定义一个消息出来函数来处理这个消息。这样就把Windows关于消息的整套流程都处理好了。 6> hIcon为托盘图标的句柄,根据这个句柄你就可以增加、修改、删除图标。7> szTip就是当你的鼠标放到任务栏托盘的小图标上的时候弹出来的提示信息。在这里我花了大量的笔墨介绍TNotifyIconData的内幕,把这部分搞清楚了,后面的东西就顺理成章了。三. 双击主窗体,进入FormCreate的代码区域:TForm1.FormCreate(Sender:TObject); Begin //NotifyIcon为全局变量,在程序的开头已经定义了 with NotifyIcon do begin cbSize:=SizeOf(TNotifyIconData); Wnd:=Handle; //指向当前窗体Form1的句柄uID:=1; uFlags:=NIM_ICON or NIM_MESSAGE or NIM_TIP; uCallBackMessage:=WM_NID; hIcon:=Application.Icon.Handle; szTip:=”张家恶少”;end;.//把设置好的变量NotifyIcon加入到系统中以便处理Shell_NotifyIcon(NIM_ADD,@NotifyIcon); End;四.接下来就是定义一个消息处理函数:系统给窗体发来了一个消息,就由下面这个函数来处理。每个消息处理函数都是处理某一类消息的,大家仔细地看看下面函数体的定义和一般的函数定义有什么不一样:消息处理函数要在后面加上消息的名称,这样当系统发来WM_NID消息时,就是自动触发WMNID消息处理函数。procedure WMNID(var msg:TMessage);message WM_NID; begin case msg.LParam of WM_LBUTTONUp; Form1.Visible:=not Form1.Visible; WM_RBUTTONUP: ShowMessage(‘您点击的是右键’); End;End;好了,一个最简单的程序诞生了,大家自己设置好自己喜欢的图标.Project->Options,选中Application页面,在Icon项中加载自己喜欢的图标,这样程序运行时,在任务栏里显示的就是你喜欢的图标了。当你单击图标时,窗体Form1会在可见与不可见之间切换,也就是说单击一下显示,再单击一下又隐藏。当你右击图标的时候会弹出一条消息:“你点击的是右键”。五.最后要记住在关闭应用程序的时候要释放掉建立的托盘程序,否则会占用系统资源。TForm1.FormDestroy(Sender:TObject);Begin Shell_NotifyIcon(NIM_DELETE,@NotifyIcon);End; 在右下角显示图标参看delphi的scktsrvr 谢谢.我的是一个NT 服务程序(用了service application).把其中的form单独拿出来没问题,和service模块放在一起运行就会崩溃.是不是NT服务程序不能这么处理呢? //在状态区添加图标function TfrmMain.AddIcon(hwnd: HWND): Boolean;begin nid.cbSize := sizeof(NOTIFYICONDATA); nid.Wnd := hwnd; nid.uID := ID_MAIN; 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 TfrmMain.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; 在右下角显示图标参看delphi的scktsrvrC:\Program Files\Borland\Delphi6\Source\Vcl ???? 如何显示在输入后按键抬起时 DBGridEh 当前输入单元格的值 ???? 计算数据库内相同字段和 文件的扫描问题?? 各位高手帮帮忙,谢了,在线等答 请问谁有delphi5开发人员指南的光盘 关于在程序中怎样实现像word一样的特殊字符 DBGrid的一个小问题!!要分的要快!!! 帮帮忙,送100分 TWinControl的问题?高手请进! TADOQuery型的控件,其中有个属性connection,这个属性是做什么用的,该怎么用,我看过帮助了,没看懂:( 哪有支持自定义函数的计算公式解析控件? 超急恐怖,求救:我的程序已经投入使用,但是发现用户信息互相覆盖。。。。。。。
参看delphi的scktsrvr
我的是一个NT 服务程序(用了service application).
把其中的form单独拿出来没问题,和service模块放在一起运行就会崩溃.是不是NT服务程序不能这么处理呢?
function TfrmMain.AddIcon(hwnd: HWND): Boolean;
begin
nid.cbSize := sizeof(NOTIFYICONDATA);
nid.Wnd := hwnd;
nid.uID := ID_MAIN;
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 TfrmMain.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;
参看delphi的scktsrvr
C:\Program Files\Borland\Delphi6\Source\Vcl