Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

КАК Запретить запуск чужой программы более 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]

в тех трех масивах держится список программ, текущее количество и максимальное количество одновременных запусков, которые нужно обрезать.
Помогите пожалуйста...


Наверх

Титульная страница Поиск, карта сайта Написать письмо