Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.06.26;
Скачать: CL | DM;

Вниз

Отловить запуск DOS-приложения   Найти похожие ветки 

 
Мишган   (2003-04-23 11:18) [0]

Поставил хук на создание окон. Все ловяться норммально, за исключением DOS-приложений. Почему ? Они ведь тоже в окне запускаются ?
Как отловить запуск DOS-приложений ?


 
Digitman ©   (2003-04-23 11:47) [1]


> Они ведь тоже в окне запускаются


что значит "тоже" ? разве GUI-приложения запускаются в каком-то там "окне" ? GUI-приложения в ходе своего исполнения сами создают окна ! Вызывая ф-цию CreateWindow[Ex] ... Этот вызов, собственно, и отслеживается твоим "хуком"... DOS-приложения же такой ф-ции не вызывают (ну не знают они, ДОС-приложения, ни о каких-то там "окнах" ! и знать не могут !), поэтому и хук на создание окна бесполезен для решения такой задачи.

А вот глоб.перехват вызова ф-ции CreateProcess[Ex] в большинстве случаев даст возможность "поймать момент" создания любого процесса, будь то ДОС-задача, или GUI-приложение, или Win32-сервис или ... ибо процесс есть процесс сам по себе, и только в ходе его старта/инициализации системе становится ясно и понятно, что конкретно от нее требуется исполнить


 
DVM ©   (2003-04-23 12:13) [2]

Я хотел бы уточнить: DOS программы (в Win98) как раз нормально отлавливаются. Не отлавливаются только окна консольных приложений в Win2000/xp. Но есть способ которым пользуется Панель Задач:

program shelhookdemo;

uses

Windows,
Messages;

const

szName : PChar = "shellhookdemo";
szClass : PChar = "shellhookdemo_class";
magicDWord = $49474541;

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;

cOsUnknown = -1;
cOsWin95 = 0;
cOsWin98 = 1;
cOsWin98SE = 2;
cOsWinME = 3;
cOsWinNT35 = 4;
cOsWinNT4 = 5;
cOsWin2000 = 6;
cOsXP = 7;

var
wc : TWndClassEx;
hMainWnd : HWND;
Mesg :TMsg;
WM_SHELLHOOK : Integer;

function MainWndProc(wnd:HWND; Msg:Integer; wParam:wParam; lParam:lParam):lResult; stdcall;
begin
if Msg = WM_SHELLHOOK then
begin
case wParam of
HSHELL_WINDOWCREATED: ;
HSHELL_WINDOWDESTROYED: ;
HSHELL_WINDOWACTIVATED: ;
HSHELL_REDRAW: ;
end;
end;
case Msg of
WM_CREATE:
begin
result:=DefWindowProc(Wnd, Msg, wParam, lParam);
end;
WM_DESTROY :
begin
Result:=0;
postquitmessage(0);
exit;
end;
else Result:=DefWindowProc(Wnd, Msg, wParam, lParam);
end;
end;
begin
wc.cbSize:=sizeof(wc);
wc.lpfnWndProc:=@MainWndProc;
wc.hInstance:=hInstance;
wc.lpszClassName:=szClass;
wc.hIcon:=LoadIcon(0,idi_application);
wc.hCursor:=LoadCursor(0,idc_arrow);

if RegisterClassEx (wc) = 0 then
begin
MessageBox (0, "Error!", "Error!", MB_OK);
exit;
end;

hMainWnd:=CreateWindowEx(
WS_EX_TOOLWINDOW,
szClass,
szName,
WS_POPUP,
0,0,0,0,0,0,
hInstance,
nil
);
if hMainWnd = 0 then
begin
MessageBox (0, "Error!", "Error!", MB_OK);
UnregisterClass(szClass, hInstance);
exit;
end;

WM_SHELLHOOK := RegisterWindowMessage("SHELLHOOK");
if WM_ShellHook<>0 then
begin
RegisterShellHook(0, 1);
if GetOperatingSystemType <= cOsWinMe then
RegisterShellHook(hMainWnd, RSH_REGISTER)
else
RegisterShellHook(hMainWnd, RSH_REGISTER_TASKMAN);
end;

while GetMessage(Mesg,0,0,0) do
begin
TranslateMessage(Mesg);
DispatchMessage(Mesg);
end;

end.

//*******************************************************

procedure RegisterShellHook(Wnd:hWnd;n:dword); stdcall; external "shell32.dll" index 181;


 
Мишган   (2003-04-23 12:30) [3]

DVM верно говорит - под 9х нормально отлавливает и DOS-приложения. Нашел машину с 98-ой, попробовал. Там работает так как доктор прописал..

Под XP - выходит тока ловить создание процессов ?
Сылкой на примерчик поможете ?



 
DVM ©   (2003-04-23 12:37) [4]

Пример выше после небольшой доработки ловит все окна во всех виндах.



Страницы: 1 вся ветка

Текущий архив: 2003.06.26;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.016 c
4-84838
Silver_
2003-04-25 18:31
2003.06.26
Клаву


3-83997
Savage
2003-05-30 14:17
2003.06.26
работа с TRDSConnection


6-84506
Smok_er
2003-04-04 18:25
2003.06.26
Как узнать, установлен (активен) ли файервол на компе или нет?


1-84312
oleg_SYS
2003-06-08 22:03
2003.06.26
Как конвейтировать TBitMap в TIcon?


3-83874
Ann
2003-06-02 14:18
2003.06.26
Grid