Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2008.05.11;
Скачать: [xml.tar.bz2];

Вниз

проблема с 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2008.05.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.008 c
2-1208032052
voe
2008-04-13 00:27
2008.05.11
Непонятное поведение Application.ProcessMessages


15-1206401988
Поп Гапон
2008-03-25 02:39
2008.05.11
Перегнать строку в Unicode, зная ее LangID


15-1206536706
смарт
2008-03-26 16:05
2008.05.11
ПО Смартов


15-1206628012
Jeer
2008-03-27 17:26
2008.05.11
Выпускникам ВУЗ-ов с военной кафедрой..


2-1208065801
honor
2008-04-13 09:50
2008.05.11
База данных без прописывания Альяса





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский