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

Вниз

RegisterShellHookWindow   Найти похожие ветки 

 
Orion2 ©   (2004-04-16 17:11) [0]

Скажите, работает ли данная йункция в Вин98?
Если работает, то как ей пользоваться (у меня никаких сообщений окну не приходит)?


 
VMcL ©   (2004-04-16 17:15) [1]

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/Windowing/Hooks/HookRe ference/HookFunctions/RegisterShellHookWindow.asp


 
DVM ©   (2004-04-16 22:06) [2]


> VMcL ©   (16.04.04 17:15) [1]

Она там неправильно описана. Одного параметра не хватает.

> Orion2 ©   (16.04.04 17:11)

Работает.
Пользоваться так:

program ShellHookDemo;

uses
 windows,
 messages,
 sysutils;

const

 HSHELL_ACTIVATESHELLWINDOW = 3;
 HSHELL_WINDOWCREATED = 1;
 HSHELL_WINDOWDESTROYED = 2;
 HSHELL_WINDOWACTIVATED = 4;
 HSHELL_GETMINRECT = 5;
 HSHELL_REDRAW = 6;
 HSHELL_TASKMAN = 7;
 HSHELL_LANGUAGE = 8;
 HSHELL_HIGHBIT =$8000 ;
 HSHELL_FLASH = $8000 or $6 ;

var
 wc : TWndClassEx;
 MainWnd : HWND;
 Mesg : TMsg;
 WndListBox:hWnd;
 WM_SHELLHOOKMESSAGE:Integer;
 xPos,yPos,nWidth,nHeight : Integer;

Procedure RegisterShellHook(Wnd:hWnd;n:dword); stdcall;external "shell32.dll" index 181;

function SetShellWindow(hWnd: HWND): dword; stdcall; external "User32.dll" name "SetShellWindow";

function GetTextFromWindow(Wnd: HWND): string;
var
 TextLength: Integer;
 Text: PChar;
begin
 TextLength := SendMessage(Wnd, WM_GETTEXTLENGTH, 0, 0);
 if TextLength = 0 then Result := ""
 else
 begin
   GetMem(Text, TextLength + 1);
   SendMessage(Wnd, WM_GETTEXT, TextLength + 1, Integer(Text));
   Result := Text;
   FreeMem(Text);
 end;
end;

function ListBox_AddString(lb : THandle; txt : String) : integer;
begin
 Result := SendMessage(lb, lb_addString, 0, integer(pchar(@txt[1])));
end;

function WindowProc(wnd:HWND; Msg : Integer; Wparam:Wparam; Lparam:Lparam):Lresult; stdcall;
begin
 if msg=WM_SHELLHOOKMESSAGE then
   begin
     case wparam of
       HSHELL_WINDOWCREATED:
         begin
           ListBox_AddString(WndListBox,"Window Created: HWND="
             +inttostr(lparam)+" Text=""+GetTextFromWindow(lparam)+""");
         end;
       HSHELL_WINDOWDESTROYED:
         begin
           ListBox_AddString(WndListBox,
             "Window Destroyed: HWND="+inttostr(lparam));
         end;
       HSHELL_WINDOWACTIVATED:
         begin
           ListBox_AddString(WndListBox,
             "Window Activated: HWND="+inttostr(lparam)+" Text=""
               +GetTextFromWindow(lparam)+""");
         end;

       HSHELL_REDRAW:
         begin
           //---
         end;

     end;
   end else
 case msg of
   wm_destroy :
     Begin
       postquitmessage(0);
       Result:=0; exit;
     End;
 else Result:=DefWindowProc(wnd,msg,wparam,lparam);
 end;
End;

begin
 wc.cbSize:=sizeof(wc);
 wc.style:=cs_hredraw or cs_vredraw;
 wc.lpfnWndProc:=@WindowProc;
 wc.cbClsExtra:=0;
 wc.cbWndExtra:=0;
 wc.hInstance:=HInstance;
 wc.hIcon:=LoadIcon(0,idi_application);
 wc.hCursor:=LoadCursor(0,idc_arrow);
 wc.hbrBackground:=COLOR_BTNFACE+1;
 wc.lpszMenuName:=nil;
 wc.lpszClassName:="ShellHookDemo";

 if RegisterClassEx (wc) = 0 then
   MessageBox (0, "Invalid class registration",
     "Error", MB_OK)
 else
   begin
     xPos:=100; yPos:=150;
     nWidth:=430; nHeight:=250;
     MainWnd:=CreateWindowEx(
       0,
       "ShellHookDemo",
       "ShellHookDemo",
       WS_popup or WS_OVERLAPPEDWINDOW,
       xPos,
       yPos,
       nWidth,
       nHeight,
       0,
       0,
       Hinstance,
       nil
       );
     if MainWnd = 0 then
       MessageBox (0, "Window not created", "Error", MB_OK)
     else
       begin
         ShowWindow(MainWnd,CmdShow);
         WM_SHELLHOOKMESSAGE := RegisterWindowMessage("SHELLHOOK");
         if WM_SHELLHOOKMESSAGE<>0 then RegisterShellHook(MainWnd, 3);

         SendMessage(GetDesktopWindow, $400, 0, 0);
         SetShellWindow(MainWnd);
         WndListbox:=CreateWindowEx(
                                    ws_ex_clientedge,
                                    "listbox",
                                    "",
                                    lbs_notify
                                    or ws_visible
                                    or ws_child
                                    or ws_vscroll,
                                    10,
                                    10,
                                    400,
                                    200,
                                    MainWnd,
                                    0,
                                    hInstance,
                                    nil
                                    );
         SendMessage(WndListBox,wm_setfont,GetStockObject(ansi_var_font),0);

       
         
       end;
   end;
 While GetMessage(Mesg,0,0,0) do
   begin
     TranslateMessage(Mesg);
     DispatchMessage(Mesg);
   end;

end.


 
Orion2 ©   (2004-05-06 18:22) [3]

> DVM
Спасибо.
Извеняюсь, что только чейчас благодарю, но как говориться лучше поздно, чем никогда :)


 
Orion2 ©   (2004-05-13 12:35) [4]

> DVM
Пришел я домой, скомпилил, запустил и... И все равно не работает - приходит только hshell_language :(


 
DVM ©   (2004-05-13 13:10) [5]


> Пришел я домой, скомпилил, запустил и... И все равно не
> работает - приходит только hshell_language :(

Долго же ты шел. Тем более странно, что в том, что я написал hshell_language вообще нет.:)

Код выше работает 100%. Проверено и мной и многими другими.
Если у тебя не работает попробуй исправить:
RegisterShellHook(MainWnd, 1);
Хрен знает, что это за параметр, но замечено, что под 98 и NT там должны быть разные числа 1 и 3 (или наоборот).


 
Orion2 ©   (2004-05-13 13:17) [6]

> DVM

:)

hshell_language я сам добавил, когда больше никакие мессаги не приходили. И 1 тоже ставил - эффект 0


 
DVM ©   (2004-05-13 13:21) [7]

Я еще заметил одну странность. Иногда (обычно после 5-10) открытий окон сообщения перестают приходить. Помогает перезагрузка только потом. Не знаю, но может надо результ какой возвращать по приходе сообщений.


 
Orion2 ©   (2004-05-13 13:24) [8]

> DVM

Да, да насчет того, что мессаги не приходят было (hshell_language). Помогала перезагрузка проги.


 
DVM ©   (2004-05-13 13:27) [9]


> Orion2 ©   (13.05.04 13:24) [8]

Я то сам потом от этой функции отказался - сделал обычный хук в dll. Там все работает + больше можно получить параметров.


 
Orion2 ©   (2004-05-13 13:42) [10]

> DVM

hook - это хорошо. Но самое смешное, что он у меня тоже не работает :), только hshell_language.

Если не жалко, поделись, пожалуйста, кодом.


 
имя   (2004-05-14 00:10) [11]

Удалено модератором


 
имя   (2004-05-14 00:25) [12]

Удалено модератором


 
имя   (2004-05-14 00:27) [13]

Удалено модератором


 
имя   (2004-05-14 00:27) [14]

Удалено модератором


 
имя   (2004-05-14 00:27) [15]

Удалено модератором


 
имя   (2004-05-14 00:27) [16]

Удалено модератором


 
Orion2 ©   (2004-05-17 17:54) [17]

Ну, Мастера, помогите. Уже не первую неделю мучаюсь - результат 0. Приходится извращаться: созздается поток, который раз в секунду отслеживает все окна, выбирает нужные и т.д. Но это же не является правильным решением задачи!


 
DVM ©   (2004-05-17 18:19) [18]


> Orion2 ©   (17.05.04 17:54) [17]

Мне кажется, у тебя с системой что-то. Должен тот код, что выше работать! Попробуй тот код, что я написал на другой машине. Кстати, приведи код, как ставишь и используешь хук WH_SHELL в dll.

> Приходится извращаться: созздается поток, который раз в
> секунду отслеживает все окна, выбирает нужные и т.д. Но
> это же не является правильным решением задачи!

Зато самое надежное. Вполне нормальное решение. К тому же единственный способ, которым удается отследить создание окон консольных приложений под nt/2000/xp. Тут даже поток необязателен. EnumWindows вызывать пару раз в секнду.


 
DVM ©   (2004-05-17 18:25) [19]


> Orion2 ©   (17.05.04 17:54) [17]

Вот еще такая штука есть:
http://web.ict.nsc.ru/~cancel/delphi/script/forum/index.php?current_msg_id=79


 
Orion2 ©   (2004-05-24 16:10) [20]

> DVM

Кстати, приведи код, как ставишь и используешь хук WH_SHELL в dll.


http://delphimaster.net/view/4-1083248098/


 
Orion2 ©   (2004-05-24 17:17) [21]

> DVM

Я еще заметил одну странность. Иногда (обычно после 5-10) открытий окон сообщения перестают приходить. Помогает перезагрузка только потом. Не знаю, но может надо результ какой возвращать по приходе сообщений.


Если примерно 1 в 10 секунд вызывать RegisterShellHookWindow, то все постоянно работает!

Есть предложение
Я так понимаю ты тоже шелл пишешь. Так вот предлагаю обменятся исходниками. Не думай, что я возьму исходники и уйду в тень - я так не поступаю.
Че в моем шелле интересненького:
1) блокировка запуска процессов (запрещенных программ) через перехват АПИ (в 98 тоже пашет!)
2) виртуальные рабочие столы
3) закладки (описывать долго - это надо увидеть :) )

Вообщем если согласен свяжись со мной t_dmitry@ukr.net. Когда отвечу не знаю (скорей всего на этой неделе), но отвечу точно!



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

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

Наверх




Память: 0.53 MB
Время: 0.034 c
3-1086355421
a123
2004-06-04 17:23
2004.07.04
Фильтрация в IBQuery1


14-1087237218
rulezz
2004-06-14 22:20
2004.07.04
i il be back!!!!


3-1086783010
AleXqwq
2004-06-09 16:10
2004.07.04
Procedure


3-1086595755
galexis
2004-06-07 12:09
2004.07.04
Переход от FB 1.0 к FB 1.5


1-1087908433
Gia Gvatua
2004-06-22 16:47
2004.07.04
Одновременное нажатие двух клавиш