Форум: "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.028 c