在系统托盘中放置delphi应用程序

看看你的任务栏。看到时间所在的区域了吗?还有其他图标吗?这个地方叫做Windows系统托盘。您想将Delphi应用程序的图标放在那里吗?您希望该图标设置动画还是反映应用程序的状态?...

看看你的任务栏。看到时间所在的区域了吗?还有其他图标吗?这个地方叫做Windows系统托盘。您想将Delphi应用程序的图标放在那里吗?您希望该图标设置动画还是反映应用程序的状态?

Businesswoman working on project on computer

这对于长时间运行而没有用户交互的程序(通常整天都在电脑上运行的后台任务)非常有用。

您可以做的是,通过在托盘中放置一个图标,同时使窗体不可见,使您的Delphi应用程序看起来像是在最小化托盘(而不是任务栏,位于Win Start按钮的右侧)。

我们把它放在托盘上吧

幸运的是,创建一个在系统托盘中运行的应用程序非常简单——只需要一个(API)函数Shell\u NotifyIcon即可完成任务。

该函数在ShellAPI单元中定义,需要两个参数。第一个是一个标志,指示是添加、修改还是删除图标,第二个是指向保存图标信息的tnotifyiconda结构的指针。其中包括要显示的图标的句柄、鼠标悬停在图标上时作为工具提示显示的文本、将接收图标消息的窗口句柄以及图标将发送到此窗口的消息类型。

首先,在主窗体的私有部分中输入以下行:TrayIconData:tnotifyiconda;

type TMainForm = class(TForm) procedure FormCreate(Sender: TObject); private TrayIconData: TNotifyIconData; { Private declarations }public{ Public declarations }end;

然后,在主窗体的OnCreate方法中,初始化TrayCondata数据结构并调用Shell\u NotifyIcon函数:

with TrayIconData dobegin cbSize := SizeOf(TrayIconData); Wnd := Handle; uID := 0; uFlags := NIF_MESSAGE + NIF_ICON + NIF_TIP; uCallbackMessage := WM_ICONTRAY; hIcon := Application.Icon.Handle; StrPCopy(szTip, Application.Title); end; Shell_NotifyIcon(NIM_ADD, @TrayIconData);

TrayCondata结构的Wnd参数指向接收与图标关联的通知消息的窗口。

hIcon指向我们要添加到托盘中的图标—在本例中,使用了应用程序主图标。szTip包含要为图标显示的工具提示文本—在本例中为应用程序标题。szTip最多可容纳64个字符。uFlags参数设置为告诉图标处理应用程序消息,使用应用程序的图标及其提示。uCallbackMessage指向应用程序定义的消息标识符。每当图标的边框中发生鼠标事件时,系统使用指定的标识符发送通知消息到Wnd标识的窗口。此参数设置为表单单元的接口部分中定义的WM_ICONTRAY常量,等于:WM_USER+1;

通过调用Shell\u NotifyIcon API函数将图标添加到托盘中。第一个参数“NIM_ADD”向托盘区域添加一个图标。另外两个可能的值NIM_DELETE和NIM_MODIFY用于删除或修改任务栏中的图标-我们将在本文后面看到如何操作。我们发送给Shell_NotifyIcon的第二个参数是初始化的TrayCondata结构。

拿一个

如果您现在运行项目,您将看到托盘中时钟附近有一个图标。注意三件事。

1) 首先,当你点击(或用鼠标做其他事情)托盘中的图标时,什么也不会发生——我们还没有创建一个过程(消息处理程序)。2)第二,任务栏上有一个按钮(我们显然不希望它出现)。3)第三,当你关闭应用程序时,图标仍保留在托盘中。

拿两个

让我们反向解决这个问题。要在退出应用程序时从任务栏中删除图标,必须再次调用Shell\u NotifyIcon,但第一个参数是NIM\u DELETE。您可以在主窗体的OnDestroy事件处理程序中执行此操作。

procedure TMainForm.FormDestroy(Sender: TObject);begin Shell_NotifyIcon(NIM_DELETE, @TrayIconData);end;

为了在任务栏中隐藏应用程序(应用程序的按钮),我们将使用一个简单的技巧。在项目源代码中添加以下行:Application.ShowMainForm:=False;创建表单(TMainForm,MainForm);例如,让它看起来像:

...begin Application.Initialize; Application.ShowMainForm := False; Application.CreateForm(TMainForm, MainForm); Application.Run;end.

最后,为了让托盘图标响应鼠标事件,我们需要创建一个消息处理过程。首先,我们在表单声明的公共部分声明了一个消息处理过程:procedure-TrayMessage(var-Msg:TMessage);消息WM_ICONTRAY;其次,此过程的定义如下所示:

procedure TMainForm.TrayMessage(var Msg: TMessage);begincase Msg.lParam of WM_LBUTTONDOWN: begin ShowMessage('Left button clicked - let''s SHOW the Form!'); MainForm.Show; end; WM_RBUTTONDOWN: begin ShowMessage('Right button clicked - let''s HIDE the Form!'); MainForm.Hide; end; end;end;

此过程仅用于处理我们的消息WM_ICONTRAY。它从消息结构中获取LParam值,该消息结构可以在激活过程时为我们提供鼠标的状态。为了简单起见,我们将只处理鼠标左下(WM_LBUTTONDOWN)和鼠标右下(WM_RBUTTONDOWN)。当鼠标左键按下图标时,我们显示主窗体,当按下鼠标右键时,我们隐藏它。当然,在这个过程中还可以处理其他的鼠标输入消息,比如,button up,button双击等等。

就这样。又快又容易。接下来,您将看到如何设置托盘中图标的动画,以及如何使该图标反映应用程序的状态。更重要的是,您将看到如何在图标附近显示弹出菜单。

  • 发表于 2021-09-11 00:20
  • 阅读 ( 180 )
  • 分类:编程

你可能感兴趣的文章

以简单的方式将firefox最小化到系统托盘

将Firefox最小化到系统托盘而不是任务栏的想法听起来吸引人吗?如果是这样的话,那么看看设置MinimizeToTray reserved扩展是多么容易。 注意:MinimizeToTray恢复版扩展适用于Firefox(3.0–3.5.*)、Thunderbird(3.0.*)、Flock(2.0)和Songbird...

  • 发布于 2021-04-14 02:38
  • 阅读 ( 93 )

键盘LED将键盘指示灯放入系统托盘中

...告,这样你就可以看到它们。键盘LED是一个小型的可定制应用程序,它在系统托盘中放置一个小指示灯,以便在您按下Caps Lock、Scroll Locks和Num Lock按钮时向您发出警告。除了自定义单个指示灯的颜色外,您还可以启用屏幕警报,...

  • 发布于 2021-07-26 19:11
  • 阅读 ( 136 )

在Windows7中获取经典网络活动指示器

...版本。当我们共享一个将键盘指示灯转换为网络指示灯的应用程序时,很多人都想知道Windows在系统托盘中有一个网络指示灯是什么意思。但在Windows7中,指示器是静态的。Windows7中典型的“两台电脑”图标闪烁,表示网络活动缺...

  • 发布于 2021-07-28 02:05
  • 阅读 ( 97 )

用delphi创建、解析和操作xml文档

...数据的通用语言。XML使开发人员能够将结构化数据从各种应用程序传递到桌面,以进行本地计算和表示。XML也是服务器到服务器传输结构化数据的理想格式。软件使用XML解析器评估文档的层次结构,提取文档的结构、内容或两者...

  • 发布于 2021-09-06 15:05
  • 阅读 ( 166 )

如何将媒体文件嵌入delphi可执行文件(rc/.res)(embed media files into a delphi executable (rc/.res))

使用声音和动画等多媒体文件的游戏和其他类型的应用程序必须随应用程序一起分发额外的多媒体文件,或者将文件嵌入可执行文件中。 您可以将原始数据作为资源添加到应用程序中,而不是分发单独的文件供应用程序使用...

  • 发布于 2021-09-06 15:08
  • 阅读 ( 194 )

了解delphi编程的基础知识

...Turbo)Pascal到Delphi 2005的演变,例如Delphi演变为一个快速应用程序部署框架,旨在为在线和移动交付提供高性能、可扩展的应用程序。 之后,探索Delphi实际上是什么,以及如何安装和配置其开发环境。在此基础上,探索DelphiIDE...

  • 发布于 2021-09-06 15:13
  • 阅读 ( 185 )

delphi中的sql

...、更新、查找数据位置等。 delphi中的tquery 如果要在应用程序中使用SQL,您将非常熟悉TQuery组件。Delphi使您的应用程序能够通过TQuery组件直接使用SQL语法来访问Paradox和dBase表(使用本地SQL—ANSI标准SQL的子集)、本地InterBase服...

  • 发布于 2021-09-08 10:40
  • 阅读 ( 187 )

如何在运行时移动和调整控件大小(在delphi应用程序中)(move and resize controls at run time (in delphi applications))

下面介绍如何在应用程序运行时使用鼠标拖动和调整控件大小(在Delphi窗体上)。 运行时的表单编辑器 在窗体上放置控件(可视组件)后,可以调整其位置、大小和其他设计时特性。但是,在某些情况下,您必须允许应用...

  • 发布于 2021-09-10 20:45
  • 阅读 ( 195 )

如何构建没有gui的控制台应用程序(build console applications with no gui)

​控制台应用程序是纯32位Windows程序,在没有图形界面的情况下运行。启动控制台应用程序时,Windows会创建一个文本模式控制台窗口,用户可以通过该窗口与应用程序进行交互。这些应用程序通常不需要太多的用户输入。控制...

  • 发布于 2021-09-10 22:34
  • 阅读 ( 251 )

用delphi编写网络感知应用程序

...Delphi为支持通过网络(internet、intranet和local)交换数据的应用程序而提供的所有组件中,最常见的两个组件是TServerSocket和TClientSocket,这两个组件都旨在通过TCP/IP连接支持读写功能。 winsock和delphi套接字组件 Windows Sockets(Winso...

  • 发布于 2021-09-10 23:39
  • 阅读 ( 199 )
wastzpeyxv
wastzpeyxv

0 篇文章

相关推荐