Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.05.11;
Скачать: CL | DM;

Вниз

проблема с unhook...   Найти похожие ветки 

 
istok   (2007-08-30 14:22) [0]

Если окно, подцепившее hook dll свёрнуто, то unhook не выгружает длл пока окно не развернется.

Видимо в свернутом виде окна не обрабатывают сообщения ?

Как сделать так чтоб unhook сразу действовал на свернутые окна?


 
Сергей М. ©   (2007-08-30 14:30) [1]


> unhook не выгружает длл пока окно не развернется


Не выдумывай.


 
istok   (2007-08-30 14:39) [2]

я проверяю ProcessExplorer"ом - что именно я могу выдумать, если вижу что длл выгружается тока после разворачивания окна ?


 
Сергей М. ©   (2007-08-30 14:43) [3]

Окно при этом не свернуто, а невидимо.

Поди на WinAmp"е заметил, когда его иконка торчит в трее, а само его окно невидимо ?


 
istok   (2007-08-30 14:48) [4]


> Поди на WinAmp"е заметил, когда его иконка торчит в трее,
>  а само его окно невидимо ?


Нет, на разных приложениях (notepad, mspaint, calc, iexplore...) и везде одно и то же поведение.

Речь о сворачивании приложений в панель задач, а не иконках в трее.


 
Сергей М. ©   (2007-08-30 15:21) [5]


> о сворачивании приложений в .. иконках в трее


Это нонсенс. Равно, впрочем, как и "в панель задач".

Приложения попросту не обладают дейстием "свернуться куда-то там")

p.s.

Попробуй после анхука послать бродкастом таким "несговорчивым" приложениям любое "безобидное" сообщение, типа WM_USER


 
istok   (2007-08-30 18:00) [6]

делаем SendMessage(HWND_BROADCAST, WM_USER, 0, 0) после анхука - бесполезно.

косяк ловится с любым свёрнутым окном.

где может быть узкое место?


 
Leonid Troyanovsky ©   (2007-08-30 19:37) [7]


> istok   (30.08.07 18:00) [6]

> где может быть узкое место?

Если хук WH_GETMESSAGE (WH_KEYBOADD/MOUSE)
нужно PostThreadMessage(hookedthreadId, WM_NULL, 0, 0)

И, в любом случае, не бродкаст.

--
Regards, LVT.


 
Rouse_ ©   (2007-08-30 22:10) [8]

... а если хук WH_CALLWNDPROC, WH_CALLWNDPROCRET то для принудительного броадкастового пинка лучше воспользоваться SendNotifyMessage или SendMessageTimeout


 
istok   (2007-08-31 11:30) [9]

там CBT хук. как лучше в таком случае слать мессагу?


 
Leonid Troyanovsky ©   (2007-08-31 11:50) [10]


> istok   (31.08.07 11:30) [9]

> там CBT хук. как лучше в таком случае слать мессагу?

Пошли обои.

--
Regards, LVT.


 
istok   (2007-09-01 12:55) [11]

посылка SendMessage(myWndHhndl, WM_USER, 0, 0) из внешнего приложения выгружает хук. Но как его выгружать из ДЛЛки - не понимаю. Как в ДЛЛке узнать какому именно окну послать хук. Когда я делаю EnumWindows, то вообще не вижу окон текущего процесса (getcurrentprocessid)...

а кстати SendMessage(HWND_BROADCAST, WM_USER, 0, 0) вообще приводит к тому, что дллка не выгружается уже никак, пока программа не закроется.


 
Leonid Troyanovsky ©   (2007-09-01 13:13) [12]


> istok   (01.09.07 12:55) [11]

> посылка SendMessage(myWndHhndl, WM_USER, 0, 0) из внешнего
> приложения выгружает хук. Но как его выгружать из ДЛЛки
> - не понимаю.

Внешнее приложение ставило хук, пусть оно и снимает.

> я делаю EnumWindows, то вообще не вижу окон текущего процесса
> (getcurrentprocessid)...

Ошибка в 17 строке.

> а кстати SendMessage(HWND_BROADCAST, WM_USER, 0, 0) вообще
> приводит к тому, что дллка не выгружается уже никак, пока
> программа не закроется.

Тебе ж сказали: не SendMessage и не бродкаст.
Да и не WM_USER

--
Regards, LVT.


 
istok   (2007-09-01 13:20) [13]


> Внешнее приложение ставило хук, пусть оно и снимает.


Как достать хендл окна, которому оно будет посылать мессагу?


> Тебе ж сказали: не SendMessage и не бродкаст.

Я в 1ом упоминании ошибся, имелось в виду что из внешней проги я шлю SendNotifyMessage с WM_User и прокатывает. Хендл беру из GetForeground, конда окно в фокусе. Но какие хендлы брать для общего случая - не знаю. Хук загружен в десятки процессов и всем надо послать мессагу..


> Да и не WM_USER

А что ?


 
Leonid Troyanovsky ©   (2007-09-01 13:32) [14]


> istok   (01.09.07 13:20) [13]

> Как достать хендл окна, которому оно будет посылать мессагу?

EnumWindows.
Слать надо не всем, а по одному на поток.

> А что ?

WM_NULL.

--
Regards, LVT.


 
istok   (2007-09-02 18:09) [15]

опыты показывают, что если слать мессагу сразу или через пару сек после анхука, то эффекта нет. А вот чекунд через 5-8 - есть.

И как тут быть... ?


 
Leonid Troyanovsky ©   (2007-09-02 19:35) [16]


> istok   (02.09.07 18:09) [15]

> опыты показывают

Воспроизводимые?

> И как тут быть... ?

Видимо, ставить те, что снимаются.

--
Regards, LVT.


 
istok   (2007-09-02 20:13) [17]

>Воспроизводимые?

Да. Сейчас поставил в "управляющей проге" слеп на 10сек перед посылкой мессаги (после стопа длл) и работает..

Может просто длл неверно анхукается..  Делаю так:
управляющая прога (которая лоадит длл) вызывает метод длл (уже загружена) который вызывает анхук. (хук ставится аналогично - УП лоадит длл, вызывает метод длл который ставит хук).

//Управляющий класс:

procedure TAppBlocker.LoadLib;
var
 hLoadedDLL: THandle;
begin
 hLoadedDLL := GetModuleHandle(cAppFltrDll);
 if hLoadedDLL <> 0 then
   FreeLibrary(hLoadedDLL);

 FHDll := LoadLibrary(PChar(cAppFltrDll));
 if not (FHDll > 0) then
   raise Exception.CreateFmt("Can""t load %s", [cAppFltrDll]);
end;

procedure TAppBlocker.StartListen;
var
 StartListen: function: Boolean stdcall;
begin
 FActive := False;
 if FHDll > HINSTANCE_ERROR then
 begin
   @StartListen := GetProcAddress(FHDll, "StartListen");
   FActive := StartListen;
 end;
end;

procedure TAppBlocker.StopListen;
var
 StopListen: function: Boolean stdcall;
begin
 if FHDll > HINSTANCE_ERROR then
 begin
   @StopListen := GetProcAddress(FHDll, "StopListen");
   FActive := not StopListen;
   Sleep(10000);
   NotifyWindows;//шлём всем wm_null
 end;
end;

function EnumWindowsProc(wHandle: HWND; LPARAM: DWORD): Bool; stdcall; export;
var
 h: Cardinal;
begin
 Result := True;

 h := GetWindowThreadProcessId(wHandle);
 if lst.IndexOf(h) = -1 then
 begin
   lst.Add(h);
   SendNotifyMessage(wHandle, WM_NULL, 0, 0);
 end;
end;

procedure TAppBlocker.NotifyWindows;
begin
 lst := TIntList.Create; //массив чисел - в данном случае id потоков. юзается для однократной посылки мессаги окну потока.
 EnumWindows(@EnumWindowsProc, 0);
 lst.Free;
end;


//ДЛЛ:

function CBTProc(Code : Integer; wParam : Word; lParam : Longint): Longint;
 stdcall;
begin
 //call next hook
 Result := CallNextHookEx(CBTHook, Code, wParam, lParam);
end;

function StartListen: Boolean; export stdcall;
begin
 Result := False;
 if SetWindowsHookEx(WH_CBT, @CBTProc, HInstance, 0) <> 0 then
   Result := True;
end;

function StopListen: Boolean; export stdcall;
begin
 Result := False;
 if CBTHook > 0 then
 begin
   Result := UnhookWindowsHookEx(CBTHook);
 end;
end;


 
app ©   (2007-09-02 20:15) [18]

> istok  (02.09.2007 20:13:17)  [17]

С дворовым сленгом на другой форум.



Страницы: 1 вся ветка

Текущий архив: 2008.05.11;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.018 c
15-1206607633
Ламо777
2008-03-27 11:47
2008.05.11
Apache&amp;SSL - перенаправление


2-1207926538
Снежинка
2008-04-11 19:08
2008.05.11
Запрос


15-1206451876
Cj
2008-03-25 16:31
2008.05.11
FileMapping и два разных языка


15-1206805991
Antonio
2008-03-29 18:53
2008.05.11
делфи через div и mod


15-1206783905
builder
2008-03-29 12:45
2008.05.11
Посоветуйте программку для прослушивания радио через интернет