Не позволяйте другим программам свернуть мое приложение Win32 - PullRequest
2 голосов
/ 14 июля 2011

У меня есть приложение Delphi, которое работает в среде, где оно сводится к минимуму другим агрессивным приложением, которое пытается полностью захватить экран (это POS).Когда запускается второе приложение, оно ищет окна и минимизирует их, возможно, перечисляя окна и нажимая на них с помощью «ShowWindow (handle, SW_MINIMIZE)».

Мне кажется, что нужно сделатьэто подобрать эти команды и заблокировать изменение размера / сворачивание сообщений в окно.Я пытался взломать несколько обработчиков, чтобы попытаться запечатлеть это поведение, но SW_MINIMIZE все равно его скрывает.И Winsight не показывает мне ничего, кроме уведомлений о том, что что-то изменяет размер и т. Д. Я добавил обработчик сообщений для сообщений WMSysCommand, но это, кажется, только останавливает такие действия, как нажатие кнопки свертывания.И я попытался переопределить функцию WndProc для фильтрации сообщений, но это тоже не обрезает.

Если кто-то мог бы пролить свет на то, что происходит, когда вызов ShowWindow (handle, SW_MINIMIZE) был применен к приложениюЯ был бы очень благодарен!

Спасибо, Терри

Ответы [ 2 ]

4 голосов
/ 14 июля 2011

Что происходит, когда ShowWindow вызывается с SW_MINIMIZE как 'nCmdShow', так это то, что оконный менеджер минимизирует окно.

Система будет отправлять различные уведомления, некоторые более важные для выполнения минимизации, и приложение может действовать, например WM_WINDOWPOSCHANGING, WM_GETMINMAXINFO, WM_NCCALCSIZE, или некоторые просто уведомлять, например WM_WINDOWPOSCHANGED, WM_MOVE, WM_SIZE, но обычно ни один из них не предназначен для блокировки операции.

Я думаю, что самый простой способ, если вы решите, что минимизация является неожиданной, - это ответить на сообщение WM_SIZE, когда wParam равно SIZE_MINIMIZED, и соответствующим образом восстановить ваше окно. Тогда ваша форма вернется с панели задач:

type
  TForm1 = class(TForm)
    ...
  private
    procedure WmSize(var Msg: TWMSize); message WM_SIZE;
  end;

procedure TForm1.WmSize(var Msg: TWMSize);
begin
  inherited;
  if (Msg.SizeType = SIZE_MINIMIZED) and IsUnexpectedMinimize then
    PostMessage(Handle, WM_SYSCOMMAND, SC_RESTORE, 0);
end;

У меня нет четкого представления о том, как вы можете решить, минимизация является неожиданной или нет, но, похоже, вы это делаете. Инициированные пользователем действия могут привести к отправке WM_SYSCOMMAND, но я не знаю, делают ли это некоторые функции ОС, и вы сможете различить, свернет ли ОС окно или агрессивное приложение.

0 голосов
/ 14 июля 2011

Окно получает сообщение WM_COMMAND, а не WM_SYSCOMMAND

...