Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2009.12.13;
Скачать: [xml.tar.bz2];

Вниз

Помогите с HCBT_CREATEWND   Найти похожие ветки 

 
Trible   (2008-10-23 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;


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


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

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


 
Trible   (2008-10-23 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;

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


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


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


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


 
DVM ©   (2008-10-23 21:13) [4]


> Trible   (23.10.08 17:11)  

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


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


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


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


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


> Trible   (23.10.08 17:37) [2]


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


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


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


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


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

Спасибо.


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

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

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

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


 
Trible   (2008-10-24 11:10) [8]


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

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


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


> Trible


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


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


> Trible   (24.10.08 11:10) [8]


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


 
Trible   (2008-10-24 11:59) [11]


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


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

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

И блокировать надо не программу целиком, а только окно диалога прибивать, который программа создает.


 
Сергей М. ©   (2008-10-24 12:19) [12]

Так речь-то, оказывается, идет всего лишь навсего о ролевом конфигурировании польз.интерфейса 1С-клиента ?

Ну и за каким лешим ты полез в хук-дебри, если речь идет о штатных возможностях 1С-системы ?


 
Trible   (2008-10-24 12:32) [13]

Штатно нельзя запретить пользователям диалоги открытия/закрытия в 1С.


 
{RASkov} ©   (2008-10-24 12:34) [14]

-Почему у меня болит ж**а?
-А это Плохиш тебе гланды удалил.
© Шматрица :)


 
Сергей М. ©   (2008-10-24 12:57) [15]


> Trible   (24.10.08 12:32) [13]


Да ты что ?!

А мужики-то и не знали)


 
Trible   (2008-10-24 13:49) [16]


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

Ну факт есть факт, надо запретить эти диалоги. Раз сам 1С не позволяет это сделать, то внешними средствами как-то пытаюсь.


 
Сергей М. ©   (2008-10-24 13:50) [17]


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


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


 
Trible   (2008-10-24 14:03) [18]


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

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

Даже если соответствующие меню/кнопки недоступны, пользователь всегда может включить их отображение, и вызвать их. Или использовать горячие клавиши.


 
Сергей М. ©   (2008-10-24 14:14) [19]

Какой такой "функции" ?

Я тебе не про ран-тайм говорю, а про дизайн-тайм, т.е. про режим создания/модификации конкретной конфигурации, в этом режиме можно сконфигурировать ролевые интерфейсы для пользователей и групп


 
Trible   (2008-10-24 14:21) [20]


> режим создания/модификации конкретной конфигурации, в этом
> режиме можно сконфигурировать ролевые интерфейсы для пользователей
> и групп

Нельзя сконфигурировать роль таким образом, чтоб запретить эти диалоги (так, чтоб находчивые пользователи не могли их сами включить).


 
Сергей М. ©   (2008-10-24 15:48) [21]

Открыть/сохранить что конкретно ?
И чем собссно чреват доступ к этим диалогам ?


 
Trible   (2008-10-24 16:16) [22]

> Открыть/сохранить что конкретно ?
открытый пользователем документ. Через пункт "Файл" -> "Сохранить.."

> И чем собссно чреват доступ к этим диалогам ?
Тем, что для пользователя это стандартное окно открытия/сохранения все равно что проводник - можно ходить по файлам и папкам, доступно контекстное меню для файлов, можно запускать файлы на исполнение или открывать документы. Можно даже вручную указывать путь к папке, которую хотят просмотреть; а лучше ведь скрыть все структуру ФС от пользователя, которому ничего не полагается делать на терминале, а только работать в 1С с заранее установленным списком документов.


 
Сергей М. ©   (2008-10-24 16:26) [23]

Ясно.

Ну и зачем для этого "блокировать" окно ?

Достаточно принять меры по деактивации соотв.элементов меню и кнопок быстрого доступа в панели инструментов.


 
DVM ©   (2008-10-26 13:34) [24]


> А программа ждала не хрен, а хэндл, и в ее алгоритме не
> предусмотрена адекватная реакция на такой неожиданный поворот
> событий.
> Как, по-твоему, при этом должна повести себя программа ?
>

вообще то такие программы удалять надо не задумываясь


 
Trible   (2008-10-27 12:35) [25]


> Ну и зачем для этого "блокировать" окно ?
> Достаточно принять меры по деактивации соотв.элементов меню
> и кнопок быстрого доступа в панели инструментов.

Блокировать окно - универсальный путь, иначе придется блокировать все по отдельности (пункты меню, кнопки на панели инструментов, горячие клавиши). Причем, стандартными средствами 1С не удается блокировать доступ к этим элементам - для роли просто нет такого правила.


 
Сергей М. ©   (2008-10-27 13:53) [26]


> Trible   (27.10.08 12:35) [25]


Ну приспичило тебя "блокировать" именно окно - блокируй, я ж не против..
Я просто предупредил тебя, что не всяккое подобного рода "хирургическое вмешательство" обходится без последствий


 
Danger ©   (2008-10-28 05:33) [27]


> Сергей М. ©   (27.10.08 13:53) [26]
> Ну приспичило тебя "блокировать" именно окно - блокируй,
>  я ж не против..

Ну так вот, как это сделать ;) Как блокировать хотя бы диалоги открытия/сохранения?


 
Сергей М. ©   (2008-10-28 08:54) [28]

Ну вот прямо так и делай - с пом. HCBT_CREATEWND


 
Сергей М. ©   (2008-10-28 09:13) [29]

А вообще, если диалоги открытия/сохранения стандартные, то копать следует совсем другой огород - перехват вызовов Get[Open|Save]FileName модуля commdlg32



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2009.12.13;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.006 c
15-1255362228
Alexio
2009-10-12 19:43
2009.12.13
Ошибки страниц


2-1256531968
Danuve
2009-10-26 07:39
2009.12.13
Создание калькулятора


2-1256117947
xyz
2009-10-21 13:39
2009.12.13
перебор выделенных строк в DBGridEh


3-1231324322
Palladin
2009-01-07 13:32
2009.12.13
Параметры ADO и условие like


15-1255594116
ocean
2009-10-15 12:08
2009.12.13
Хочу повесить программу,





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