Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.49 MB
Время: 0.03 c
3-1079617236
overword
2004-03-18 16:40
2004.04.18
Interbase обозвал union как Invalid token ((


1-1080925481
Ivolg
2004-04-02 21:04
2004.04.18
Кнопки в ворде


1-1081024220
SergP
2004-04-04 00:30
2004.04.18
есть ли аналог pos() без учета регистра?


3-1080018854
russko
2004-03-23 08:14
2004.04.18
Путь к БД


3-1079530673
DimaF
2004-03-17 16:37
2004.04.18
Firebird





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский