Конференция "WinAPI" » Помогите с HCBT_CREATEWND [D7]
 
  • Trible (23.10.08 17:11) [0]
    Hello,
    Такая ситуация: нужно блокировать окна, заголовок которых начинается с определенной подстроки. Ставлю хук на WH_CBT, в обработчике хука пишу:

    function HookWndProc( Code: Integer; WParam: WPARAM; LParam: LPARAM ): LRESULT; stdcall;
    var strCaption: PChar;

    begin
    Result:= 0; // default action

    if ( Code < 0 ) then
      Result := CallNextHookEx( HookHandle, Code, WParam, LParam )
    else
     if ( Code = HCBT_CREATEWND ) then
     begin
       strCaption:= CBT_CREATEWND( Pointer( lParam )^ ).lpcs.lpszName;
       if ( strCaption <> nil ) then
       begin
         // caption defined
        // ..... strCaption checks .......
       end;
     end;

    end;



    Проблема происходит при проверке полученного заголовка окна. Не могу составить условие проверки, начинается ли заголовок словом "Открытие документа". Как это сделать?
  • Сергей М. © (23.10.08 17:22) [1]
    Если CompareMem(strCaption, PChar('Открытие документа'), 17) вернет истину, то окно найдено
  • Trible (23.10.08 17:37) [2]

    > Если CompareMem(strCaption, PChar('Открытие документа'),
    >  17) вернет истину, то окно найдено

    Ну например, хочу заблокировать запуск Блокнота, заголовок окна которого при запуске начинается подстрокой "Безымянный ..." :


    function HookWndProc( Code: Integer; WParam: WPARAM; LParam: LPARAM ): LRESULT; stdcall;
    var strCaption: PChar;

    begin
    Result:= 0; // default action

    if ( Code < 0 ) then
     Result := CallNextHookEx( HookHandle, Code, WParam, LParam )
    else
    if ( Code = HCBT_CREATEWND ) then
    begin
      strCaption:= CBT_CREATEWND( Pointer( lParam )^ ).lpcs.lpszName;
      if ( strCaption <> nil ) then
      begin
        if CompareMem( strCaption, PChar( 'Безымянный' ) , 10 ) then Result:= 1; // block window;
      end;
    end;

    end;



    Так вот не блокируется запуск блокнота, т.е. создание окна, начинающегося на заданную подстроку. Почему - не могу понять.

    ЗЫ. Сперва думал, что хук вообще не работает, но написал

    if CompareMem( strCaption, PChar( 'T' ) , 1 ) then Result:= 1; // block window;


    и вылетело часть окон системы (в т.ч. и сам Делфи), так что хук ставится.
  • Сергей М. © (23.10.08 19:48) [3]

    > хочу заблокировать запуск Блокнота


    Это ты сам додумался, что с пом. этого хука можно чего-то там "блокировать" ? Или какой-то идиот тебе это подсказал ?
  • DVM © (23.10.08 21:13) [4]

    > Trible   (23.10.08 17:11)  

    с помощью ловушек надо отслеживать момент появления нужных окон, потом зная окно, надо выяснять какому процессу оно принадлежит и далее разбираться с процессом - убивать и т.д.
  • Сергей М. © (24.10.08 09:45) [5]

    > DVM ©   (23.10.08 21:13) [4]


    > надо отслеживать момент появления нужных окон


    Не надо их отслеживать.
    Уже на момент загрузки глобального хук-модуля можно узнать, в чьё АП модуль загружен. Этого вполне достаточно.


    > Trible   (23.10.08 17:37) [2]


    > Почему - не могу понять


    Потому что процесс Блокнота создает окно с совсем другой подписью и уже в ходе последующей работы меняет подпись созданного ранее окна на ту которую ты лицезреешь.
  • Trible (24.10.08 10:52) [6]

    > Сергей М. ©   (24.10.08 09:45) [5]
    > Потому что процесс Блокнота создает окно с совсем другой
    > подписью и уже в ходе последующей работы меняет подпись
    > созданного ранее окна на ту которую ты лицезреешь.


    Хорошо, тогда как блокировать окна, заголовок которых заранее известен и не меняется (например у системных диалогов Открыть/Сохранить). Конкретно, как заблокировать диалоги, заголовок окна которых начинается на "Открыть" и "Сохранить", дайте пожалуйста рабочий пример кода.

    Спасибо.
  • Сергей М. © (24.10.08 11:03) [7]
    Что значит "заблокировать" ?

    ты вообще представляешь себе, чем чреваты твои попытки "блокировки" ?

    Видимо, не представляешь ..
  • Trible (24.10.08 11:10) [8]

    > Что значит "заблокировать" ?
    > ты вообще представляешь себе, чем чреваты твои попытки "блокировки"
    > Видимо, не представляешь ..

    Задача стоит в блокировании ВСЕХ диалогов открытия/сохранения, для ВСЕХ программ запущенных в пользовательской сессии.
  • Сергей М. © (24.10.08 11:11) [9]

    > Trible


    Вот тебе картина маслом: некая программа пытаясь создать окно вызывает ф-цию CreateWindow[Ex], ожидая результатом хэндл созданного окна, чтобы дальше, в соответствии с предусмотнренным алгоритмом, взаимодействовать с этим окном. А вместо хэндла программа получает хрен с редькой, потому что ты в своем хуке запретил создание этого окна. А программа ждала не хрен, а хэндл, и в ее алгоритме не предусмотрена адекватная реакция на такой неожиданный поворот событий.
    Как, по-твоему, при этом должна повести себя программа ?
    На основании чего ты уверен, что программа тихо и незаметно для пользователя завершится ?
  • Сергей М. © (24.10.08 11:12) [10]

    > Trible   (24.10.08 11:10) [8]


    Чем вызвана такая блажь ?
  • Trible (24.10.08 11:59) [11]

    > Чем вызвана такая блажь ?


    Список приложений пользователя ограничен искусственно, поэтому врядли попадется строптивая программа.

    В сервере терминалов вызывается одна-единственная программа, 1С 8.1, и в зависимости от залогинившегося пользователя надо запретить диалоги открытия/сохранения. Стандартными способами (через 1С) это нельзя сделать.

    И блокировать надо не программу целиком, а только окно диалога прибивать, который программа создает.
  • Сергей М. © (24.10.08 12:19) [12]
    Так речь-то, оказывается, идет всего лишь навсего о ролевом конфигурировании польз.интерфейса 1С-клиента ?

    Ну и за каким лешим ты полез в хук-дебри, если речь идет о штатных возможностях 1С-системы ?
  • Trible (24.10.08 12:32) [13]
    Штатно нельзя запретить пользователям диалоги открытия/закрытия в 1С.
  • {RASkov} © (24.10.08 12:34) [14]
    -Почему у меня болит ж**а?
    -А это Плохиш тебе гланды удалил.
    © Шматрица :)
  • Сергей М. © (24.10.08 12:57) [15]

    > Trible   (24.10.08 12:32) [13]


    Да ты что ?!

    А мужики-то и не знали)
  • Trible (24.10.08 13:49) [16]

    > Сергей М. ©   (24.10.08 12:57) [15]
    > Да ты что ?!
    >
    > А мужики-то и не знали)

    Ну факт есть факт, надо запретить эти диалоги. Раз сам 1С не позволяет это сделать, то внешними средствами как-то пытаюсь.
  • Сергей М. © (24.10.08 13:50) [17]

    > Раз сам 1С не позволяет это сделать


    Что, вот прямо так она тебе и сказала - "не позволяю это сделать" ?
  • Trible (24.10.08 14:03) [18]

    > Что, вот прямо так она тебе и сказала - "не позволяю это
    > сделать" ?

    Нет функции отключения функции вызова диалогов для определенных пользователей. То есть теоретически для пользователя эти диалоги доступны всегда.

    Даже если соответствующие меню/кнопки недоступны, пользователь всегда может включить их отображение, и вызвать их. Или использовать горячие клавиши.
  • Сергей М. © (24.10.08 14:14) [19]
    Какой такой "функции" ?

    Я тебе не про ран-тайм говорю, а про дизайн-тайм, т.е. про режим создания/модификации конкретной конфигурации, в этом режиме можно сконфигурировать ролевые интерфейсы для пользователей и групп
 
Конференция "WinAPI" » Помогите с HCBT_CREATEWND [D7]
Есть новые Нет новых   [134435   +33][b:0][p:0.001]