Форум: "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