Форум: "WinAPI";
Текущий архив: 2004.04.18;
Скачать: [xml.tar.bz2];
ВнизКАК Запретить запуск чужой программы более N раз? Найти похожие ветки
← →
Freestyler (2004-01-24 03:28) [0]Значит работаю через Hook
WH_CBT
ловлю HCBT_CREATEWND:
и HCBT_DESTROYWND
так вот: если в HCBT_DESTROYWND я делаю вот так:If pos("Word",TCBTCreateWnd(Pointer(lParam)^).lpcs.lpszName)>0 Then
то ворд естественно не запускается...
Result:= 12345
а вот если делаю так:s:=TCBTCreateWnd(Pointer(lParam)^).lpcs.lpszName;
If arrcount>1 then
for i:=1 to arrCount do
if fn[i]=s Then
Begin
CONT[i]:=CONT[i]+1;
If coNt[i]>tot[i] Then Begin cont[i]:=-1;Result:= 12345; break;end;
end;
то все виснет :( ...
масив cont - количество запусков проги
tot - макс количество запусков проги
fn - имя проги....
текст процедуры такой:function SysMsgProc(code : integer; wParam : word; lParam : longint) : longint; export; stdcall;
var
f: TextFile;
windtext, windir: array [0..255] of char;
s,Filedir,str:String;
i:integer;
begin
Result := CallNextHookEx(SysHook, Code, wParam, lParam);
case code of
HCBT_CREATEWND:
begin
Str:=TCBTCreateWnd(Pointer(lParam)^).lpcs.lpszName;
if Str="" then exit;
if TCBTCreateWnd(Pointer(lParam)^).lpcs.hwndParent<>0 then exit;
Wnd := wParam;
GetWindowText(Wnd, windtext, 255);
{s:=TCBTCreateWnd(Pointer(lParam)^).lpcs.lpszName;
If arrcount>0 then
for i:=1 to arrCount do
if fn[i]=s Then
Begin
CONT[i]:=CONT[i]+1;
If coNt[i]>tot[i] Then Begin cont[i]:=-1;Result:= 12345; break;end;
end;
end;
HCBT_DESTROYWND:
begin
Str:="";
Wnd := wParam;
if Wnd<>0 then
GetWindowText(Wnd, windtext, 255);
str:=windtext;
if windtext="" then exit;
if Str="" then exit;
s:=TCBTCreateWnd(Pointer(lParam)^).lpcs.lpszName;
If arrcount>0 then
for i:=1 to arrCount do
if fn[i]=s Then
Begin
CONT[i]:=CONT[i]-1;
end;
end;
end;
end;
← →
Freestyler (2004-01-24 03:30) [1]в тех трех масивах держится список программ, текущее количество и максимальное количество одновременных запусков, которые нужно обрезать.
Помогите пожалуйста...
← →
Freestyler (2004-01-24 03:41) [2]Сорри, вот этот в пункте о ворде должен не HCBT_DESTROYWND, а HCBT_CREATEWND
"так вот: если в HCBT_CREATEWND я делаю вот так:
If pos("Word",TCBTCreateWnd(Pointer(lParam)^).lpcs.lpszName)>0 Then
Result:= 12345 то ворд естественно не запускается...
а вот если делаю так:
s:=TCBTCreateWnd(Pointer(lParam)^).lpcs.lpszName;
If arrcount>1 then
for i:=1 to arrCount do
if fn[i]=s Then
Begin
CONT[i]:=CONT[i]+1;
If coNt[i]>tot[i] Then Begin cont[i]:=-1;Result:= 12345; break;end;
end;
то все виснет :( ..."
← →
Digitman © (2004-01-24 15:45) [3]виснет это или не виснет - другой вопрос ... но здесь нет даже ни намека именно на запрет запуска ворда
← →
Freestyler (2004-01-24 22:22) [4]да нет... запретить запустить ворд я могу:
вот таким способом:If pos("Word",TCBTCreateWnd(Pointer(lParam)^).lpcs.lpszName)>0 Then
Result:= 12345
(по доке если result<>0 то отбой...)
это работает...
но вот когда я в циклу перебираю значения (какая программа запускается),s:=TCBTCreateWnd(Pointer(lParam)^).lpcs.lpszName;
If arrcount>1 then
for i:=1 to arrCount do
if fn[i]=s Then
Begin
CONT[i]:=CONT[i]+1;
If coNt[i]>tot[i] Then Begin cont[i]:=-1;Result:= 12345; break;end;
end;
то вот тут все и виснет...
← →
Digitman © (2004-01-26 08:25) [5]
> запретить запустить ворд я могу
это ты просто некое окно пытаешься идентифицировать .. не более того ..
окно же это запрошено к созданию не святым духом, а Вордом .. который уже запущен и вызвал ф-цию CreateWindow[Ex].. о факте чего ты, собственно, и имеешь счастье быть извещенным в своем хуке
← →
Freestyler (2004-01-27 02:32) [6]:(
ну а как тогда лучше отлавливать запус программы и запретить запускать ее?
читал о хуке на WH_SHELL так там тоже отлавливается только создание ТОП окна (верхнего)...
или я ошибаюсь?
вот уже несколько дней бьюсь... помогите пожалуйста
← →
Digitman © (2004-01-27 08:08) [7]глоб.хук здесь вообще не поможет
такая задача решаема только с помощью kernel-mode драйвера
← →
GrayFace © (2004-01-27 16:02) [8]Смотри у окна ProcessID, потом OpenProcess и terminate. Можешь хранить список процессов, чтобы не закрывать лишнего. Только terminate - это не очень хорошо, т.к. там вроде память загрязняется.
← →
Freestyler (2004-01-27 22:02) [9]спасибо, попробую ;)
← →
Freestyler (2004-01-27 22:05) [10]А что на это все скажет господин Зотов?
Может есть какой вариант отследить запуск процесса?
← →
Freestyler (2004-01-31 00:39) [11]А как запретить запускать DOS приложение?
Я так понимаю, окно не создается, когда приложение в полноекранном режиме, или я ошибаюсь?
← →
GrayFace © (2004-01-31 13:35) [12]В NT DOS прога - это окно. В 98 не знаю. В NT бери командную строку окон проги cmd.exe и по ней определяй запускаемую.
← →
Freestyler (2004-02-02 22:31) [13]хммм....
придется поизвращться :)
← →
Freestyler (2004-02-15 00:38) [14]хмм... дело в том, что до закрытия этого окна программа может сделать какое то действие (ну например пооткрывать ДБФ файлы и индексы)... Если ее теперь вот так закрыть, то индексы полетят нафиг... а это не есть гуд.
А можно как-то вообще не дать запуститься этому процессу? (тоесть отлавливать момент запуска и там позволять или запрещать старт этого процесса)
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.04.18;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.034 c