Текущий архив: 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.5 MB
Время: 0.006 c