Перехват сворачивания на Taskbar

  • Автор темы Автор темы Guest
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.
G

Guest

В программе сидит очень досадный жук, который генерирует BSOD в процессе сворачивания программы с последующим перезапуском компьютера. Точнее говоря, BSOD генерируется драйвером при обращении к функции чтения регистра процессора, выполняемой в режиме Ring0. Обращение происходит периодически каждые полсекунды. Процесс обращения к функции выделен в отдельный поток. Поэтому мне хотелось бы перед тем, как моё приложение будет свёрнуто на панель задач, данный поток был бы приостановлен. Для этого мне необходимо перехватывать (возможно) существующее WM-сообщение. Пока я делаю это следующим образом:

procedure TForm1.WMMES(var Msg: TMessage);
begin
case MSG.LParam of
$0012F5D0..$0012F5D4: SearchThread.Suspend;
$0012F798: MessageBox(0,'Restart the program, please!','CBId: Warning',MB_ICONWARNING or MB_TASKMODAL);
end;
end;


Метод это работает только на моём ПК :(
 
У объекта Application есть событие OnMinimize акоторое можно обрабатывать.
 
<!--QuoteBegin-Джангл Виталий+19:08:2005, 10:42 -->
<span class="vbquote">(Джангл Виталий @ 19:08:2005, 10:42 )</span><!--QuoteEBegin-->Для этого мне необходимо перехватывать (возможно) существующее WM-сообщение.
[snapback]23708" rel="nofollow" target="_blank[/snapback]​
[/quote] Это сообщение WM_SysCommand

...
private
Procedure WMGetSysCommand(var Message : TMessage);message WM_SysCommand;
...

Procedure TForm1.WMGetSysCommand(var Message : TMessage);
Begin
IF (Message.wParam = SC_MINIMIZE) then ShowMessage('Сейчас окно будет свернуто');
Inherited;
End;
 
Хе-хе, спасибо за ответы! Однако, забыл уточнить, что у окна программы нет строки заголовка, где традиционно находятся три кнопки. Проблема заключается в том, что окно, когда оно отображается, можно единственным образом свернуть банальным кликом по кнопке на Taskbar, соответствующей этому окну, что есть фирменной «фишкой» Windows Точно также, по клику кнопки на Taskbar, окно можно развернуть. В этих случаях оконное сообщение WM_SysCommand не генерируется. Так что, проблема гораздо сложнее, чем кажется.
 
Кстати, Гуру, твое предложение тоже не работает:

Код:
public
 { Public declarations }
 procedure WinHandler(Sender: TObject);
…
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMinimize := WinHandler;
end;
procedure TForm1.WinHandler(Sender: TObject);
begin
Showmessage('Ups!');
end;

Окно сворачивается без всякого предупреждения. Зато мессага ‘Ups’ успешно появляется при попытке восстановить окно кликом по кнопке на таскбаре.
 
Скажем так .. работает оно нормально с обычным приложением. OnMinimize срабаытвает после минимизации. А Ваш ShowMessage появляется как Вам кажется только при попытке восстановления, это не совсем верно. Просто тогда приложение активизируется и Вы видите Вашу месагу. Попробуйте в этом обработчике менять к примеру тайтл у Вашего апликэйшна.

Насчёт минимизации при нажатии на таскбаре .. кстати я проверил OnMimimize приходит. Опять же проверял на обычном виндовс приложении .. пустой форме...
 
Barmutik, увы, под операционной системой Windows XP при минимизации окна принудительная обработка onMinimize не происходит ни при нажатии на кнопку сворачивания в строке заголовка окна, ни при нажатии на кнопку на Taskbar-е. Использовал вышеприведенный мною код для «чистой» формы нового проекта. Компилировал под Delphi 3 и Delphi 6 – результат тот же – обработка OnMinimize окна не происходит.

Кстати, да, если менять тайтл окна

Application.Title:='minimized';

то, вроде, работает :)
 
Я пробовал только на Дельфи 7 под ВинХР ... работает ... ну на моём компе точно ...
 
А почему бы не использовать компонент TApplicationEvents (вкладка Additional) и обрабатывать событие ApplicationEvents1Minimize?

Код:
procedure TForm1.ApplicationEvents1Minimize(Sender: TObject);
begin
Showmessage('Ups!');
end;
 
А я вообще-то про что всё это вреям говорю ? :)

TApplicationEvent всенго лиш врапер который даёт доступ к методам и свойствам объекта TApplication...
 
Попробуйте сообщение WM_SIZE при wParam = SIZE_MINIMIZED
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab

Похожие темы

🚀 Первый раз на Codeby?
Гайд для новичков: что делать в первые 15 минут, ключевые разделы, правила
Начать здесь →
🔴 Свежие CVE, 0-day и инциденты
То, о чём ChatGPT ещё не знает — обсуждаем в реальном времени
Threat Intel →
💼 Вакансии и заказы в ИБ
Pentest, SOC, DevSecOps, bug bounty — работа и проекты от проверенных компаний
Карьера в ИБ →

HackerLab