Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2003.06.26;
Скачать: [xml.tar.bz2];

Вниз

Отловить запуск 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2003.06.26;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.027 c
1-84352
testthewest
2003-06-16 15:29
2003.06.26
Как перетащить файл ИЗ моей программы в проводник


3-84037
olevar_y
2003-06-02 05:54
2003.06.26
Как встроить Case_Insensetive в SQL запрос Like


14-84764
Rafik
2003-06-03 16:05
2003.06.26
Честное слово!!!


1-84422
IL
2003-06-09 16:22
2003.06.26
Вызов процедуры


14-84651
AFrolov
2003-06-09 17:14
2003.06.26
подходы к составлению рассписания





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский