Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Запуск программы [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


Наверх

Титульная страница Поиск, карта сайта Написать письмо