![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как завершить работу другого приложения раньше Windows
p_evghenii © (2007-12-17 12:32:00)Такая задача: есть два приложения, постоянно выполняющиеся в фоновом режиме: одно "мое" и одно "не мое". При завершении работы Windows "мое" приложение отслеживает это и завершает работу "не моего приложения". Проблема в том, что неизвестно, к какому приложению раньше придет сообщение о завершении Винды, т.е. мне надо, чтобы "мое" приложение раньше получало это сообщение и именно оно и завершало работу "не моего". Но получается, что часто сообщение приходит раньше не "к моему" приложению, а мне это не надо, т.к. "не мое" приложение тогда задает не нужный вопрос пользователю.
Leonid Troyanovsky (2007-12-18 13:01:00) [1]
> p_evghenii (18.12.07 12:41) [13]
> hook := SetWindowsHookEx(WH_CALLWNDPROC, @CbtProc, HInstance,
> 0);
Во-первых, см [14].
Во-вторых, глобальный хук не нужен, т.е., не 0, а threadID того "не моего".
В-третьих, message находится не в wparam, а lparam: CWPRETSTRUCT.
--
Regards, LVT.
Сергей М. (2007-12-18 12:46:00) [2]
> p_evghenii (18.12.07 12:41) [13]
1. Функция CbtProc() должна быть объявлена и реализована в dll.
2. значение, лежащее впеременной hook, д.б. доступно всем процессам, в АП которых внедрен образ хук-библиотеки.
3. ShowMessage в теле функции не допустим.
p_evghenii (2007-12-18 12:41:00) [3]var
hook: HHook;
function CbtProc(code: integer; wparam: integer; lparam: integer):Integer; stdcall;
begin
if wparam = WM_QueryEndSession then
showmessage('No');
Result := CallNextHookEx(hook, Code, wParam, lParam);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
hook := SetWindowsHookEx(WH_CALLWNDPROC, @CbtProc, HInstance, 0);
end;
Leonid Troyanovsky (2007-12-18 11:44:00) [4]
> p_evghenii (17.12.07 17:17) [11]
> Можно примерчик? пробовал создать что-то по примерам
Плохо создал or плохой пример.
Показывай созданное.
--
Regards, LVT.
p_evghenii (2007-12-17 17:17:00) [5]Можно примерчик? пробовал создать что-то по примерам, что здесь нашел, но винда зависает...
DiamondShark (2007-12-17 15:36:00) [6]
> в каком месте кода внедрять?
В том, который выполняется заведомо до завершения работы системы.
p_evghenii (2007-12-17 15:14:00) [7]Извините за глупый вопрос: как использовать SetWindowsHookEx, в каком месте кода внедрять?
Leonid Troyanovsky (2007-12-17 14:54:00) [8]
> DiamondShark © (17.12.07 14:26) [7]
> SetWindowsHookEx с параметром WH_GETMESSAGE и лови получение
> WM_QUERYENDSESSION
The WM_QUERYENDSESSION message is sent,
а не post, т.е., WH_CALLWNDPROC*
--
Regards, LVT.
DiamondShark (2007-12-17 14:26:00) [9]SetWindowsHookEx с параметром WH_GETMESSAGE и лови получение WM_QUERYENDSESSION "не твоим" приложением.
p_evghenii (2007-12-17 14:08:00) [10]Ответ не понял. "Не мое" приложение - оконное
Leonid Troyanovsky (2007-12-17 13:05:00) [11]
> homm © (17.12.07 12:46) [3]
> а если е оконное, то и никаких вопросов оно пользователю
> задавать не может :)
Например, консольное, with HandlerRoutine.
--
Regards, LVT.
p_evghenii (2007-12-17 12:50:00) [12]>>Т.е. задача сводится твоего приложения к изменению поведения чужого приложения при получении им WM_QUERYENDSESSION
Совершенно верно. Только мне хочется, чтобя я получал WM_QUERYENDSESSION раньше, чем "не мое" приложение.
Оно оконное.
homm (2007-12-17 12:46:00) [13]> [1] Leonid Troyanovsky © (17.12.07 12:38)
> Если "не мое" - оконное, то можно зацепить его хуком
а если е оконное, то и никаких вопросов оно пользователю задавать не может :)
Сергей М. (2007-12-17 12:39:00) [14]Т.е. задача сводится твоего приложения к изменению поведения чужого приложения при получении им WM_QUERYENDSESSION ?
Leonid Troyanovsky (2007-12-17 12:38:00) [15]
> p_evghenii (17.12.07 12:32)
> Такая задача: есть два приложения, постоянно выполняющиеся
> в фоновом режиме: одно "мое" и одно "не мое".
Если "не мое" - оконное, то можно зацепить его хуком.
--
Regards, LVT.