![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запуск программы [D3, D5, Win95/98]
OxOTHuK © (2003-02-24 22:10:00)как отследить вновь запускаемую программу? узнать путь к ней и хэндл окна?
UNIVERSAL (2003-02-26 17:30:00) [1]Спасибо попробую, но думаю ситуация не изменится.
DVM (2003-02-26 16:42:00) [2]Можно попробовать взять текст из окна посылом ему сообщения:
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 16:31:00) [3]Нет, не пустой. При присвоении ему (окну) заголовка SetWindowText, прокатывает правда через раз. Мелькает иногда мой заголовок/его заголовок и остается ессно его заголовок.
DVM (2003-02-26 16:17:00) [4]А хэндл не пустой? Насчет lparam я не проверял, но там по идее должен быть хэндл окна, которое создается/уничтожается.
GetWindowText немного глючная, есть др. способ получить заголовок.
Если хэндл есть, то окно уже создано, т.е. заголовок получить можно.
Я в свое время окна ловил хуком, но не таким, а стандартным, расположенным в dll, но в WinXp так не удавалось отловить создание консольных окон.
Есть еще одна тонкость: этот способ,недокументированный и предназначенный мелкософтом исключительно для своего эксплорера, поэтому желательно выгружать его из памяти.
UNIVERSAL (2003-02-26 15:28:00) [5]Спасибо буду ждать письма, а с хендлом окна я уже методом тыка разобрался. А вот чё то вызывая ф-ю GetWindowText, только заголовок не могу получить, почему-то, наверное его ещё нет что ли?
DVM (2003-02-26 12:46:00) [6]Что с кодировкой случилось не знаю я просто из Aditora текст копировал.
Пример этот вышлю, если надо.
> А как получить Handle созданого окна?
if msg=wm_shellhook then
begin
case wparam of
...
end;
{***** Вот здесь lparam сообщения и есть Handle*****}
Wnd:=lparam;
end;
universal (2003-02-26 09:56:00) [7]А как получить Handle созданого окна?
universal (2003-02-26 09:11:00) [8]А, вообще, пример классный. Только ничего про функцию RegisterShellHook я не нашёл, даже на сайте MSDN. DVM, если не трудно вышли на почту мне энто с комментариями в нормальной (Win Cyrilic) кодировке, плз.
universal (2003-02-26 08:42:00) [9]Млин, DVM , коментарии в какой кодировке написаны, а то разобрать не могу, а очень хочется.
OxOTHuK (2003-02-25 22:23:00) [10]Спасибо.... посмотрим....
за комментарии отдельное спасибо... =)
DVM (2003-02-25 18:41:00) [11]Продолжение
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);//
DVM (2003-02-25 18:39:00) [12]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:38:00) [13]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; //
UNIVERSAL (2003-02-25 16:48:00) [14]CreateSnapshot - делает снимок всех запущенных процессов. Можешь поставить на таймер, можешь ставить CBT хук.
OxOTHuK (2003-02-25 07:53:00) [15]а что это такое? попробовал поискать - нету....
вероятно это можно организовать глобальными хуками, но КАК???
Cobalt (2003-02-24 22:31:00) [16]поиск в инете(Yandex, Google - не важно) - ToolHelp, CreateSnapshot