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

Тема в разделе "Delphi - Система", создана пользователем -, 19 авг 2005.

Статус темы:
Закрыта.
  1. Гость

    В программе сидит очень досадный жук, который генерирует 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;


    Метод это работает только на моём ПК :(
     
  2. Barmutik

    Barmutik Гость

    У объекта Application есть событие OnMinimize акоторое можно обрабатывать.
     
  3. Poseidon

    Poseidon Гость

    <!--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

     
  4. Гость

    Хе-хе, спасибо за ответы! Однако, забыл уточнить, что у окна программы нет строки заголовка, где традиционно находятся три кнопки. Проблема заключается в том, что окно, когда оно отображается, можно единственным образом свернуть банальным кликом по кнопке на Taskbar, соответствующей этому окну, что есть фирменной «фишкой» Windows Точно также, по клику кнопки на Taskbar, окно можно развернуть. В этих случаях оконное сообщение WM_SysCommand не генерируется. Так что, проблема гораздо сложнее, чем кажется.
     
  5. Гость

    Кстати, Гуру, твое предложение тоже не работает:

    Код (Text):
    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’ успешно появляется при попытке восстановить окно кликом по кнопке на таскбаре.
     
  6. Barmutik

    Barmutik Гость

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

    Насчёт минимизации при нажатии на таскбаре .. кстати я проверил OnMimimize приходит. Опять же проверял на обычном виндовс приложении .. пустой форме...
     
  7. Гость

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

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

    Application.Title:='minimized';

    то, вроде, работает :)
     
  8. Barmutik

    Barmutik Гость

    Я пробовал только на Дельфи 7 под ВинХР ... работает ... ну на моём компе точно ...
     
  9. Poseidon

    Poseidon Гость

    А почему бы не использовать компонент TApplicationEvents (вкладка Additional) и обрабатывать событие ApplicationEvents1Minimize?

    Код (Text):
    procedure TForm1.ApplicationEvents1Minimize(Sender: TObject);
    begin
    Showmessage('Ups!');
    end;
     
  10. Barmutik

    Barmutik Гость

    А я вообще-то про что всё это вреям говорю ? :)

    TApplicationEvent всенго лиш врапер который даёт доступ к методам и свойствам объекта TApplication...
     
  11. mike.dld

    mike.dld Гость

    Попробуйте сообщение WM_SIZE при wParam = SIZE_MINIMIZED
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей