Предотвращение появления панели задач Windows, когда полноэкранное приложение активно - PullRequest
2 голосов
/ 25 августа 2011

У нас есть приложение, которое показывает небольшое окно «всегда сверху».Это прекрасно работает в целом.Как и другие приложения, когда он активен, панель задач показывает его как выбранное.

Теперь добавьте PowerPoint в режиме слайд-шоу в микс.Наше окно видно, и PowerPoint имеет весь экран.Все хорошо.Пока вы не нажмете на наше окно, и Windows 7 покажет панель задач с выбранным приложением.Панель задач находится в передней части полноэкранного дисплея PowerPoint, и это вызывает замешательство у пользователей.Особенно тогда, когда они будут нажимать на значок на панели задач, который заставляет наше приложение быть свернутым.

Если мы используем ExStyle CreateParams, чтобы установить WS_EX_TOOLWINDOW и убедиться, что WS_EX_APPWINDOW не установлен, то мы не будем отображаться на панели задач, но панель задач все равно будет выведена на передний план.Если это имеет какое-то значение, то используемый язык - Delphi, версия XE.

Тогда возникает вопрос, как мы можем запретить Windows показывать панель задач поверх PowerPoint, когда наше приложение Always on Top сфокусировано.

Ответы [ 2 ]

2 голосов
/ 25 августа 2011

Как уже написано в предыдущих комментариях, это поведение 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.
1 голос
/ 26 августа 2011

Похоже, вы хотите, чтобы ваш апплет появлялся и действовал как плавающая панель инструментов, связанная с Powerpoint, так что пользователь думает, что он все еще использует Powerpoint, а не отдельное приложение?

Один из способов создать эту иллюзию - использовать стиль окна WS_EX_NOACTIVATE : когда пользователь щелкает по нему, вы все равно должны получать щелчки, которые вы можете обрабатывать, чтобы активировать свою функциональность, но Powerpoint должен оставаться активное окно.

Обратите внимание, что это работает только в том случае, если все, что нужно вашему приложению, это обрабатывать одиночные клики; если вам нужно получить ввод с клавиатуры, вам нужно стать активным и сфокусироваться, и окна будут отображать панель задач как обычно.

(Кроме того, рассмотрите возможность реализации горячей клавиши с помощью RegisterHotKey, чтобы пользователи клавиатуры, которые не могут щелкнуть окно, могли по-прежнему иметь доступ к любой из этих функций.)

...