![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
КАК Запретить запуск чужой программы более N раз? [D7, Win95/98, WinME, NT4, Win2k, WinXP]
Freestyler © (2004-01-24 03:28:00)Значит работаю через 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-02-15 00:38:00) [1]хмм... дело в том, что до закрытия этого окна программа может сделать какое то действие (ну например пооткрывать ДБФ файлы и индексы)... Если ее теперь вот так закрыть, то индексы полетят нафиг... а это не есть гуд.
А можно как-то вообще не дать запуститься этому процессу? (тоесть отлавливать момент запуска и там позволять или запрещать старт этого процесса)
Freestyler (2004-02-02 22:31:00) [2]хммм....
придется поизвращться :)
GrayFace (2004-01-31 13:35:00) [3]В NT DOS прога - это окно. В 98 не знаю. В NT бери командную строку окон проги cmd.exe и по ней определяй запускаемую.
Freestyler (2004-01-31 00:39:00) [4]А как запретить запускать DOS приложение?
Я так понимаю, окно не создается, когда приложение в полноекранном режиме, или я ошибаюсь?
Freestyler (2004-01-27 22:05:00) [5]А что на это все скажет господин Зотов?
Может есть какой вариант отследить запуск процесса?
Freestyler (2004-01-27 22:02:00) [6]спасибо, попробую ;)
GrayFace (2004-01-27 16:02:00) [7]Смотри у окна ProcessID, потом OpenProcess и terminate. Можешь хранить список процессов, чтобы не закрывать лишнего. Только terminate - это не очень хорошо, т.к. там вроде память загрязняется.
Digitman (2004-01-27 08:08:00) [8]глоб.хук здесь вообще не поможет
такая задача решаема только с помощью kernel-mode драйвера
Freestyler (2004-01-27 02:32:00) [9]:(
ну а как тогда лучше отлавливать запус программы и запретить запускать ее?
читал о хуке на WH_SHELLтак там тоже отлавливается только создание ТОП окна (верхнего)...
или я ошибаюсь?
вот уже несколько дней бьюсь... помогите пожалуйста
Digitman (2004-01-26 08:25:00) [10]
> запретить запустить ворд я могу
это ты просто некое окно пытаешься идентифицировать .. не более того ..
окно же это запрошено к созданию не святым духом, а Вордом .. который уже запущен и вызвал ф-цию CreateWindow[Ex].. о факте чего ты, собственно, и имеешь счастье быть извещенным в своем хуке
Freestyler (2004-01-24 22:22:00) [11]да нет... запретить запустить ворд я могу:
вот таким способом:
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-24 15:45:00) [12]виснет это или не виснет - другой вопрос ... но здесь нет даже ни намека именно на запрет запуска ворда
Freestyler (2004-01-24 03:41:00) [13]Сорри, вот этот в пункте о ворде должен не 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;
то все виснет :( ..."
Freestyler (2004-01-24 03:30:00) [14]в тех трех масивах держится список программ, текущее количество и максимальное количество одновременных запусков, которые нужно обрезать.
Помогите пожалуйста...