Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как завершить работу другого приложения раньше 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.


Наверх

Титульная страница Поиск, карта сайта Написать письмо