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

Вниз

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 вся ветка

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

Наверх





Память: 0.56 MB
Время: 0.044 c
6-1084215582
AndersoNRules
2004-05-10 22:59
2004.07.04
TIdTCPClient vs TSocketClient


1-1087804847
GALIM
2004-06-21 12:00
2004.07.04
Timer


4-1085580560
Jel
2004-05-26 18:09
2004.07.04
Посмотрите пожалуйста, что крамольного в коде?


1-1087385031
Duncan
2004-06-16 15:23
2004.07.04
Проблема с освобождением памяти


14-1087371407
Sergey(RD)
2004-06-16 11:36
2004.07.04
Delphi vs Asm





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский