![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
проблема с unhook... [D7, WinXP]
istok © (2007-08-30 14:22:00)Если окно, подцепившее hook dll свёрнуто, то unhook не выгружает длл пока окно не развернется.
Видимо в свернутом виде окна не обрабатывают сообщения ?
Как сделать так чтоб unhook сразу действовал на свернутые окна?
app (2007-09-02 20:15:00) [1]> istok (02.09.2007 20:13:17) [17]
С дворовым сленгом на другой форум.
istok (2007-09-02 20:13:00) [2]>Воспроизводимые?
Да. Сейчас поставил в "управляющей проге" слеп на 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;
Leonid Troyanovsky (2007-09-02 19:35:00) [3]
> istok (02.09.07 18:09) [15]
> опыты показывают
Воспроизводимые?
> И как тут быть... ?
Видимо, ставить те, что снимаются.
--
Regards, LVT.
istok (2007-09-02 18:09:00) [4]опыты показывают, что если слать мессагу сразу или через пару сек после анхука, то эффекта нет. А вот чекунд через 5-8 - есть.
И как тут быть... ?
Leonid Troyanovsky (2007-09-01 13:32:00) [5]
> istok (01.09.07 13:20) [13]
> Как достать хендл окна, которому оно будет посылать мессагу?
EnumWindows.
Слать надо не всем, а по одному на поток.
> А что ?
WM_NULL.
--
Regards, LVT.
istok (2007-09-01 13:20:00) [6]
> Внешнее приложение ставило хук, пусть оно и снимает.
Как достать хендл окна, которому оно будет посылать мессагу?
> Тебе ж сказали: не SendMessage и не бродкаст.
Я в 1ом упоминании ошибся, имелось в виду что из внешней проги я шлю SendNotifyMessage с WM_User и прокатывает. Хендл беру из GetForeground, конда окно в фокусе. Но какие хендлы брать для общего случая - не знаю. Хук загружен в десятки процессов и всем надо послать мессагу..
> Да и не WM_USER
А что ?
Leonid Troyanovsky (2007-09-01 13:13:00) [7]
> 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 12:55:00) [8]посылка SendMessage(myWndHhndl, WM_USER, 0, 0) из внешнего приложения выгружает хук. Но как его выгружать из ДЛЛки - не понимаю. Как в ДЛЛке узнать какому именно окну послать хук. Когда я делаю EnumWindows, то вообще не вижу окон текущего процесса (getcurrentprocessid)...
а кстати SendMessage(HWND_BROADCAST, WM_USER, 0, 0) вообще приводит к тому, что дллка не выгружается уже никак, пока программа не закроется.
Leonid Troyanovsky (2007-08-31 11:50:00) [9]
> istok (31.08.07 11:30) [9]
> там CBT хук. как лучше в таком случае слать мессагу?
Пошли обои.
--
Regards, LVT.
istok (2007-08-31 11:30:00) [10]там CBT хук. как лучше в таком случае слать мессагу?
Rouse_ (2007-08-30 22:10:00) [11]... а если хук WH_CALLWNDPROC, WH_CALLWNDPROCRET то для принудительного броадкастового пинка лучше воспользоваться SendNotifyMessage или SendMessageTimeout
Leonid Troyanovsky (2007-08-30 19:37:00) [12]
> istok (30.08.07 18:00) [6]
> где может быть узкое место?
Если хук WH_GETMESSAGE (WH_KEYBOADD/MOUSE)
нужно PostThreadMessage(hookedthreadId, WM_NULL, 0, 0)
И, в любом случае, не бродкаст.
--
Regards, LVT.
istok (2007-08-30 18:00:00) [13]делаем SendMessage(HWND_BROADCAST, WM_USER, 0, 0) после анхука - бесполезно.
косяк ловится с любым свёрнутым окном.
где может быть узкое место?
Сергей М. (2007-08-30 15:21:00) [14]
> о сворачивании приложений в .. иконках в трее
Это нонсенс. Равно, впрочем, как и "в панель задач".
Приложения попросту не обладают дейстием "свернуться куда-то там")
p.s.
Попробуй после анхука послать бродкастом таким "несговорчивым" приложениям любое "безобидное" сообщение, типа WM_USER
istok (2007-08-30 14:48:00) [15]
> Поди на WinAmp'е заметил, когда его иконка торчит в трее,
> а само его окно невидимо ?
Нет, на разных приложениях (notepad, mspaint, calc, iexplore...) и везде одно и то же поведение.
Речь о сворачивании приложений в панель задач, а не иконках в трее.
Сергей М. (2007-08-30 14:43:00) [16]Окно при этом не свернуто, а невидимо.
Поди на WinAmp'е заметил, когда его иконка торчит в трее, а само его окно невидимо ?
istok (2007-08-30 14:39:00) [17]я проверяю ProcessExplorer'ом - что именно я могу выдумать, если вижу что длл выгружается тока после разворачивания окна ?
Сергей М. (2007-08-30 14:30:00) [18]
> unhook не выгружает длл пока окно не развернется
Не выдумывай.