Форум: "WinAPI";
Текущий архив: 2003.04.24;
Скачать: [xml.tar.bz2];
ВнизЗапуск программы Найти похожие ветки
← →
OxOTHuK (2003-02-24 22:10) [0]как отследить вновь запускаемую программу? узнать путь к ней и хэндл окна?
← →
Cobalt (2003-02-24 22:31) [1]поиск в инете(Yandex, Google - не важно) - ToolHelp, CreateSnapshot
← →
OxOTHuK (2003-02-25 07:53) [2]а что это такое? попробовал поискать - нету....
вероятно это можно организовать глобальными хуками, но КАК???
← →
UNIVERSAL (2003-02-25 16:48) [3]CreateSnapshot - делает снимок всех запущенных процессов. Можешь поставить на таймер, можешь ставить CBT хук.
← →
DVM (2003-02-25 18:38) [4]program ShellHookDemo;
uses
windows,
messages;
const
RSH_DEREGISTER = 0;
RSH_REGISTER = 1;
RSH_REGISTER_PROGMAN = 2;
RSH_REGISTER_TASKMAN = 3;
HSHELL_ACTIVATESHELLWINDOW = 3;
HSHELL_WINDOWCREATED = 1;
HSHELL_WINDOWDESTROYED = 2;
HSHELL_WINDOWACTIVATED = 4;
HSHELL_GETMINRECT = 5;
HSHELL_REDRAW = 6;
HSHELL_TASKMAN = 7;
HSHELL_LANGUAGE = 8;
var
wc : TWndClassEx; //
← →
DVM (2003-02-25 18:39) [5]program ShellHookDemo;
uses
windows,
messages;
const
RSH_DEREGISTER = 0;
RSH_REGISTER = 1;
RSH_REGISTER_PROGMAN = 2;
RSH_REGISTER_TASKMAN = 3;
HSHELL_ACTIVATESHELLWINDOW = 3;
HSHELL_WINDOWCREATED = 1;
HSHELL_WINDOWDESTROYED = 2;
HSHELL_WINDOWACTIVATED = 4;
HSHELL_GETMINRECT = 5;
HSHELL_REDRAW = 6;
HSHELL_TASKMAN = 7;
HSHELL_LANGUAGE = 8;
var
wc : TWndClassEx;
MainWnd : HWND;
Mesg : TMsg;
WndListBox:hWnd;
WM_ShellHook:Integer;
xPos,yPos,nWidth,nHeight : Integer;
osInfo:OSVERSIONINFO;
Procedure RegisterShellHook(Wnd:hWnd;n:dword); stdcall;external "shell32.dll" index 181;
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_shellhook then
begin
case wparam of
HSHELL_WINDOWCREATED: ListBox_AddString(WndListBox,"Window Created");//
HSHELL_WINDOWDESTROYED: ListBox_AddString(WndListBox,"Window Destroyed");
HSHELL_WINDOWACTIVATED: ListBox_AddString(WndListBox,"Window Activated");
end;
end;
case msg of
wm_destroy :
Begin
postquitmessage(0); exit;
Result:=0;
End;
else Result:=DefWindowProc(wnd,msg,wparam,lparam);
end;
End;
продолжение следует...
← →
DVM (2003-02-25 18:41) [6]Продолжение
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";
RegisterClassEx(wc);//
← →
OxOTHuK (2003-02-25 22:23) [7]Спасибо.... посмотрим....
за комментарии отдельное спасибо... =)
← →
universal (2003-02-26 08:42) [8]Млин, DVM , коментарии в какой кодировке написаны, а то разобрать не могу, а очень хочется.
← →
universal (2003-02-26 09:11) [9]А, вообще, пример классный. Только ничего про функцию RegisterShellHook я не нашёл, даже на сайте MSDN. DVM, если не трудно вышли на почту мне энто с комментариями в нормальной (Win Cyrilic) кодировке, плз.
← →
universal (2003-02-26 09:56) [10]А как получить Handle созданого окна?
← →
DVM (2003-02-26 12:46) [11]Что с кодировкой случилось не знаю я просто из Aditora текст копировал.
Пример этот вышлю, если надо.
> А как получить Handle созданого окна?
if msg=wm_shellhook then
begin
case wparam of
...
end;
{***** Вот здесь lparam сообщения и есть Handle*****}
Wnd:=lparam;
end;
← →
UNIVERSAL (2003-02-26 15:28) [12]Спасибо буду ждать письма, а с хендлом окна я уже методом тыка разобрался. А вот чё то вызывая ф-ю GetWindowText, только заголовок не могу получить, почему-то, наверное его ещё нет что ли?
← →
DVM (2003-02-26 16:17) [13]А хэндл не пустой? Насчет lparam я не проверял, но там по идее должен быть хэндл окна, которое создается/уничтожается.
GetWindowText немного глючная, есть др. способ получить заголовок.
Если хэндл есть, то окно уже создано, т.е. заголовок получить можно.
Я в свое время окна ловил хуком, но не таким, а стандартным, расположенным в dll, но в WinXp так не удавалось отловить создание консольных окон.
Есть еще одна тонкость: этот способ,недокументированный и предназначенный мелкософтом исключительно для своего эксплорера, поэтому желательно выгружать его из памяти.
← →
UNIVERSAL (2003-02-26 16:31) [14]Нет, не пустой. При присвоении ему (окну) заголовка SetWindowText, прокатывает правда через раз. Мелькает иногда мой заголовок/его заголовок и остается ессно его заголовок.
← →
DVM (2003-02-26 16:42) [15]Можно попробовать взять текст из окна посылом ему сообщения:
function GetText(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;
← →
UNIVERSAL (2003-02-26 17:30) [16]Спасибо попробую, но думаю ситуация не изменится.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.04.24;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.009 c