如何使Delphi做的程序不显示在任务栏中

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使Delphi做的程序不显示在任务栏中相关的知识,希望对你有一定的参考价值。

如果不需要用户界面,那么按照服务程序的方式开发就可以了,Windows Service:

具体开发步骤:
  1、New->Other->Service Application

  2、现在一个服务程序的框架已经搭起来了,打开Service1窗口,有几个属性说明一下:

  AllowPause:是否允许暂停

  AllowStop: 是否允许停止

  Dependencies: 设置服务的依存关系,服务的启动是否依赖于某个服务或者组

  DisplayName: 在“服务”窗口显示的名称

  Interactive: 设置为true时可以和Windows桌面进行交互,如果我们想在服务里显示窗体的话此设置就要设置为true,另外ServiceType必须为stWin32

  Password: 密码

  StartType: 启动方式

  3、如果我们想让服务与窗体交互,步骤如下:

  在工程中新建一个窗体fmMain

  然后在Service1的OnStart中写代码

  procedure TService1.ServiceStart(Sender: TService; var Started: Boolean);

  begin

  Started := True;

  Svcmgr.Application.CreateForm(TFmMain, fmMain);

  FmMain.show;

  end;

  OnStop的代码

  procedure TService1.ServiceStop(Sender: TService; var Stopped: Boolean);

  begin

  Stopped := True;

  FmMain.Free;

  end;

  这样在服务启动的时候就会显示出新建的那个窗体

  4、编译完成后,我们可以安装服务了,安装方法为:

  在cmd窗口中执行 appname /install,

  如F:\\Book\\DService\\Project1.exe /install

  这样服务就安装完成了

  5、同样,删除时也是在cmd窗口输入命令 appname /uninstall

  如F:\\Book\\DService\\Project1.exe /uninstall

  关于其他:

  1、关于服务程序的调试

  如果我们开发的服务有多个窗体,程序的调试无疑是个大问题

  其实服务程序稍微一改就能改成一个标准的Win32工程,为了防止不停的变来变去,我们可以加上一个编译条件,通过编译条件来切换生成服务程序还是普通可执行程序,假设编译条件为 NormalApp,在以下几个地方需要加入编译条件

  工程文件中,单元的引用

  $IFDEF NormalApp

  Forms,

  $ELSE

  SvcMgr,

  $ENDIF

  工程初始化

  $IFDEF NormalApp

  Application.Initialize;

  Application.CreateForm(TFmMain, FmMain);

  Application.Run;

  $ELSE

  if not Application.DelayInitialize or Application.Installing then

  Application.Initialize;

  Application.CreateForm(TService1, Service1);

  Application.Run;

  $ENDIF

  这样我们就可以通过增加/删除NormalApp的编译条件来切换服务程序和普通窗口程序了
参考技术A 需要将DPR文件里的 Application.MainFormOnTaskbar 属性设置为False,
然后使用 ShowWindow(Application.Handle, SW_HIDE) 就能隐藏任务栏图标了。
有什么副作用不太清楚,呵呵。

如何让您的 MDI MFC 应用程序在任务栏中显示一个实例?

【中文标题】如何让您的 MDI MFC 应用程序在任务栏中显示一个实例?【英文标题】:How do you make your MDI MFC app show one instance in the TaskBar? 【发布时间】:2012-11-06 17:08:46 【问题描述】:

我有一个 MDI 应用程序,当我单击新文档时,它会打开一个单独的选项卡。这将在 Windows 的任务栏中创建另一个图标实例。有什么办法可以改变这种行为,以便在任务栏上只显示一个图标实例?

我知道一种方法是使用 SDI 并在视图中使用选项卡,但我想将其保留为 MDI。这甚至可能吗。

我试图模仿这个名为“Dameware NT Utilities”的特定应用程序的视图: http://www.dameware.com/v3-dameware/media/DameWare/DW%20NTU/Carousel/DRS-Primary-medium.png?width=490&height=276&ext=.png

【问题讨论】:

我相信每个***窗口在任务栏中都有一个标签。避免这种情况的唯一方法是让每个窗口都成为主窗口的子窗口。 在我的应用程序中,我有一个主框架和一个子框架。我的视图当前都在使用子框架,但选项卡仍显示在任务栏中。这是否意味着框架层次结构与窗口层次结构不同?你知道我将如何将子窗口设置为主窗口的子窗口吗? 抱歉,我现在明白你的意思了。显然 MDI 界面的某些方面我已经过时了。 我很高兴地说,经过大量的挖掘,我终于找到了解决方案。我会发布作为答案。感谢马克让我思考正确的道路。这是覆盖子窗口(子框架)CanShowOnTaskBarTabs() 方法的问题。 【参考方案1】:

经过一天的挖掘,我找到了解决方案。天哪,终于弄清楚这一点感觉很好。无论如何,这是解决方案。

我只需要重写子框架的CanShowOnTaskBarTabs() 方法来返回FALSE。这是类方法:

首先,在childframe.h文件中,将如下代码放入类声明中

public:
     virtual BOOL CanShowOnTaskBarTabs() override;

然后在您的 childframe.cpp 文件中,将以下代码放在最底部:

BOOL CChildFrame::CanShowOnTaskBarTabs()

    return FALSE;

这里有更多关于这个主题的信息:http://msdn.microsoft.com/en-us/library/ee256255(v=vs.100).aspx

【讨论】:

没有出现在类向导中,但仍然有效!【参考方案2】:

我有一个更简单的解决方案。在应用程序类InitInstance() 方法上,只需调用

EnableTaskbarInteraction(FALSE);

在创建主框架之前。然后,当鼠标悬停在其任务栏图标上时,每个应用程序实例将获得一个视图,而不是每个 seub-window 一个视图。

【讨论】:

以上是关于如何使Delphi做的程序不显示在任务栏中的主要内容,如果未能解决你的问题,请参考以下文章

delphi程序如何从任务栏及时还原、显示窗体?

使 Tkinter 窗口显示在任务栏中

使浏览器窗口在任务栏中闪烁

Delphi程序在任务栏显示不了?

如何在任务栏中显示 QMainWindow

有关delphi程序的问题