Как сделать окно, чтобы остаться под всеми другими окнами («самый нижний») - PullRequest
1 голос
/ 20 февраля 2009

Точный дубликат : Как сделать окно «всегда внизу»?
Похожие: Окно на рабочем столе?


Я разрабатываю небольшое приложение в Delphi, которое должно вести себя как стартовая панель оболочки (замена) (для Windows Embedded). У меня есть несколько значков / кнопок, которые запускают другие приложения. Дело в том, что приложения должны постоянно находиться перед «оболочкой». Кроме того, приложения запускаются с помощью простого щелчка, но если используется двойной щелчок (случайно), приложение будет отставать («оболочка» будет сфокусирована)

Поскольку это приложение заменит реальную оболочку (Проводник) должен будет вести себя аналогично Проводнику ... поэтому он должен постоянно оставаться в "фоновом режиме" и не должен появляться в списке ALT + TAB.

Я протестировал множество комбинаций SetWindowPos с HWND_BOTTOM , SWP_NOACTIVATE и т. Д. Без успеха ..

Кроме того, я нашел некоторую информацию об этом, но она не работает так, как рекламируется:
Как сохранить форму всегда в фоновом режиме (самый нижний)

Любые намеки, как всего этого достичь?

Обновление: Для сокрытия окна от списка / переключателя ALT-TAB (и от панели задач, но, поскольку я заинтересован в создании замены оболочки, которая не будет панелью задач), я нашел следующие статьи:

Скрыть кнопку приложения Delphi из панели задач
Скрыть кнопку приложения Delphi 2007 из панели задач (с MainFormOnTaskBar)

Ответы [ 6 ]

2 голосов
/ 20 февраля 2009
1 голос
/ 20 февраля 2009

Неясно, пытаетесь ли вы заставить свое приложение вести себя как «панель запуска» поверх текущей оболочки, или если вы пытаетесь сделать свое приложение оболочкой.

Между этими двумя есть большая разница.

Похоже, что последний вариант - это то, что вам действительно нужно, и тогда панели задач и т. Д. Не должны вызывать никаких проблем - их там не будет, поскольку они являются частью старой оболочки (explorer.exe), которую вы заменили.

SharpEnvironment , замена оболочки с открытым исходным кодом, сделанная с Delphi, может дать вам несколько советов на этом пути.

0 голосов
/ 21 февраля 2018

Это то, что вы хотите?

procedure SetWindowPosToBack(handle: HWND);
begin
  SetWindowPos(Handle,HWND_BOTTOM,0,0,0,0,SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);
end;
0 голосов
/ 22 февраля 2009

Часто задаваемые вопросы по Win32 на протяжении десятилетий. См. профессиональная группа Win32 API

0 голосов
/ 20 февраля 2009

@ dummzeuch Решение, которое вы упомянули, не включает в себя какой-либо код, только некоторые предложения ... кроме того, не обрабатывает проблему ALT-TAB, которую мне тоже нужно решить (мое окно не должно появляться в списке ALT-TAB, подобно тому, как Explorer - как оболочка - веди себя).

@ Wouter Мне нужно создать замену оболочки (полноэкранную форму без полей), которая должна оставаться на «дне» все время, как обычная оболочка Explorer (которая заменит). Так что он должен оставаться снизу, а не сверху, как вы предлагали.

Эта замена "оболочки" используется для решения Windows Embeded, где я не могу использовать обычную оболочку Explorer. Эта форма оболочки включает некоторые «программные кнопки» (TImage для эмуляции значков) для некоторых выбранных исполняемых файлов, которые можно запускать из нее. Проблема в это то, что мне нужно убедиться, что оболочка все время остается позади, в противном случае она может скрывать некоторые другие приложения (например: многократный быстрый щелчок по значку, который запустит приложение, но переключится на оболочку, или при использовании ALT TAB) .

В связи с этим у меня есть еще один вопрос: есть ли какой-либо способ ожидания запуска любого приложения?

Я буду очень признателен за некоторые подсказки кода, чтобы начать.

0 голосов
/ 20 февраля 2009

Я не уверен, какой именно эффект вы пытаетесь достичь, но я думаю, что вы в основном хотите изменить рабочую область на экране.

Вы можете получить текущую рабочую область как TRect с Monitor.WorkareaRect. Вы можете установить его через SystemparametersInfo ()

Приведенный ниже пример превращает вашу форму в нечто, более или менее напоминающее работу панели задач Windows:

  • без границ
  • всегда сверху
  • застрял в нижней части экрана
  • другие приложения Windows, которые развернуты, будут увеличиваться только до верхней части нашей формы.

Дайте мне знать, если вы это имеете в виду.

procedure TfrmMain.FormCreate(Sender: TObject);
var
  Rect :TRect;
begin
  Height      := 25;
  BorderStyle := bsNone;
  FormStyle   := fsStayOnTop;
  Rect        := Monitor.WorkareaRect;
  Rect.Bottom := Rect.Bottom - Height;
  Left        := Rect.Left;
  Width       := Rect.Right;
  Top         := Rect.Bottom;
  SystemparametersInfo(SPI_SETWORKAREA,0, @Rect,SPIF_SENDCHANGE);
end;

Некоторые вещи, которые следует иметь в виду:

  • Когда ваша программа завершит работу, рабочая область на вашем рабочем столе останется такой же, как вы ее установили, поэтому не забудьте восстановить ее перед завершением работы приложения. Я уверен, что вы поймете, как это сделать.

  • При изменении размера панели задач Windows работающие приложения уведомляются об изменении, а развернутые приложения корректируют свой размер в соответствии с новой рабочей областью. Вышеприведенный код, похоже, не вызывает этого, поэтому вам может понадобиться найти способ сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...