【问题标题】:Preventing the Windows task bar from appearing when a full screen app active当全屏应用程序处于活动状态时,防止出现 Windows 任务栏
【发布时间】:2011-11-03 18:42:04
【问题描述】:

我们有一个应用程序会显示一个小的“始终在顶部”窗口。这通常工作正常。与其他应用程序一样,当它处于活动状态时,任务栏会将其显示为选中状态。

现在将幻灯片模式的 PowerPoint 添加到组合中。我们的窗口是可见的,而 PowerPoint 拥有整个屏幕。一切都好。直到,也就是说,您单击我们的窗口,Windows 7 会显示选择了我们的应用程序的任务栏。任务栏被带到了 PowerPoint 全屏显示的前面,这引起了用户的困惑。特别是他们会点击任务栏上的图标,这会导致我们的应用程序最小化。

如果我们使用ExStyle CreateParams 设置WS_EX_TOOLWINDOW 并确保WS_EX_APPWINDOW 没有设置,那么我们就不会出现在Taskbar 中,但是Taskbar 无论如何还是被带到了最前面。如果有什么不同,使用的语言是 Delphi,XE 版本。

接下来的问题是,当我们的 Always on Top 应用程序被聚焦时,我们如何阻止 Windows 在 PowerPoint 顶部显示任务栏。

【问题讨论】:

  • 这对我来说似乎是完全正常的 Windows 行为。您能想出另一个按您希望的方式运行的程序吗?
  • @Rob 不,我找不到任何其他应用程序可以满足我的需求。我知道一些会从中受益的人。而这在 XP 中并没有发生。
  • 这是弹窗还是重叠窗,我觉得应该是弹窗..
  • 如果用户无法让任务栏显示,他们如何切换应用程序?
  • @David 无意阻止用户显示任务栏 - 所有常用方法仍然有效。我想停止的是当应用程序从 PowerPoint 获得焦点时自动显示任务栏。用户不希望它显示。想象一下顶部的应用程序正在控制 powerpoint 以跳转到另一张幻灯片。他们点击,应用程序完成了它的工作,但任务栏出现并搞砸了。

标签: delphi winapi powerpoint taskbar


【解决方案1】:

在之前的 cmets 中已经写过,这是 Windows 的行为。

就我个人而言,我使用了几个屏幕来避免这种行为:

  • 第一个屏幕有任务栏
  • 然后我将我的 powerpoint 显示到另一个没有任务栏的屏幕(扩展桌面)。

顺便说一句,我可以像这样管理您的期望...这不是很漂亮,但我认为它可以按您的预期工作:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, AppEvnts;

type
  TForm1 = class(TForm)
    aplctnvnts1: TApplicationEvents;
    procedure aplctnvnts1Deactivate(Sender: TObject);
    procedure aplctnvnts1Activate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    procedure SetTaskBarVisible(bVisible: Boolean);
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.SetTaskBarVisible(bVisible: Boolean);
const
//  START_BUTTON_LABEL = 'Démarrer';
  START_BUTTON_LABEL = 'Start';
begin
  if bVisible then
  begin
    ShowWindow(FindWindow('Shell_TrayWnd', nil               ), SW_SHOW);
    ShowWindow(FindWindow('Button'       , START_BUTTON_LABEL), SW_SHOW);
  end
  else if FindWindow('screenClass', nil) > 0 then  // Fullscreen PowerPoint
  begin
    ShowWindow(FindWindow('Shell_TrayWnd', nil               ), SW_HIDE);
    ShowWindow(FindWindow('Button'       , START_BUTTON_LABEL), SW_HIDE);
  end;
end;

procedure TForm1.aplctnvnts1Activate(Sender: TObject);
begin
  SetTaskBarVisible(False);
end;

procedure TForm1.aplctnvnts1Deactivate(Sender: TObject);
begin
  SetTaskBarVisible(True);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  SetTaskBarVisible(True);
end;

end.

【讨论】:

  • 耶!这比我想做的还多。如果他们愿意,我不想阻止用户获取任务栏。只是为了在没有充分理由的情况下阻止它出现。
  • 如果您的应用失去焦点,任务栏会重新出现...您甚至可以在应用中添加一个按钮使其可见...
【解决方案2】:

听起来您希望您的小程序出现并通过它作为与 Powerpoint 关联的浮动工具栏来运行,以便用户认为他们仍在使用 Powerpoint 而不是单独的应用程序?

提供这种错觉的一种方法是在窗口上使用 whe WS_EX_NOACTIVATE 样式:当用户单击它时,您仍应获得可以处理的单击以触发您的功能,但 Powerpoint 应保持活动窗口。

请注意,这仅适用于您的应用只需要处理单击的情况;如果您需要接收键盘输入,则必须激活并获得焦点,并且窗口将照常显示任务栏。

(顺便说一句,还可以考虑使用 RegisterHotKey 实现热键,以便无法单击窗口的键盘用户仍然可以访问此功能。)

【讨论】:

  • 嗯,一个最有趣的选项。我确实需要更复杂的交互,但也许我可以根据发生的情况改变模式。
猜你喜欢
  • 1970-01-01
  • 2013-05-08
  • 1970-01-01
  • 1970-01-01
  • 2016-06-23
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多