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

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

Помогите с HCBT_CREATEWND [D7]


Страницы:   1 2

Trible ©   (2008-10-23 17:11:00) 

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;


Проблема происходит при проверке полученного заголовка окна. Не могу составить условие проверки, начинается ли заголовок словом "Открытие документа". Как это сделать?


Сергей М.   (2008-10-24 11:11:00) [21]


> Trible


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


Trible   (2008-10-24 11:10:00) [22]


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

Задача стоит в блокировании ВСЕХ диалогов открытия/сохранения, для ВСЕХ программ запущенных в пользовательской сессии.


Сергей М.   (2008-10-24 11:03:00) [23]

Что значит "заблокировать" ?

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

Видимо, не представляешь ..


Trible   (2008-10-24 10:52:00) [24]


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


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

Спасибо.


Сергей М.   (2008-10-24 09:45:00) [25]


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


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


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


> Trible   (23.10.08 17:37) [2]


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


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


DVM   (2008-10-23 21:13:00) [26]


> Trible   (23.10.08 17:11)  

с помощью ловушек надо отслеживать момент появления нужных окон, потом зная окно, надо выяснять какому процессу оно принадлежит и далее разбираться с процессом - убивать и т.д.


Сергей М.   (2008-10-23 19:48:00) [27]


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


Это ты сам додумался, что с пом. этого хука можно чего-то там "блокировать" ? Или какой-то идиот тебе это подсказал ?


Trible   (2008-10-23 17:37:00) [28]


> Если 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;

и вылетело часть окон системы (в т.ч. и сам Делфи), так что хук ставится.


Сергей М.   (2008-10-23 17:22:00) [29]

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


Страницы:   1 2

Наверх

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