-
Hello, Такая ситуация: нужно блокировать окна, заголовок которых начинается с определенной подстроки. Ставлю хук на WH_CBT, в обработчике хука пишу:
function HookWndProc( Code: Integer; WParam: WPARAM; LParam: LPARAM ): LRESULT; stdcall;
var strCaption: PChar;
begin
Result:= 0;
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
end;
end;
end;
Проблема происходит при проверке полученного заголовка окна. Не могу составить условие проверки, начинается ли заголовок словом "Открытие документа". Как это сделать?
-
Если CompareMem(strCaption, PChar('Открытие документа'), 17) вернет истину, то окно найдено
-
> Если CompareMem(strCaption, PChar('Открытие документа'), > 17) вернет истину, то окно найдено
Ну например, хочу заблокировать запуск Блокнота, заголовок окна которого при запуске начинается подстрокой "Безымянный ..." :
function HookWndProc( Code: Integer; WParam: WPARAM; LParam: LPARAM ): LRESULT; stdcall;
var strCaption: PChar;
begin
Result:= 0;
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; end;
end;
end;
Так вот не блокируется запуск блокнота, т.е. создание окна, начинающегося на заданную подстроку. Почему - не могу понять. ЗЫ. Сперва думал, что хук вообще не работает, но написал
if CompareMem( strCaption, PChar( 'T' ) , 1 ) then Result:= 1;
и вылетело часть окон системы (в т.ч. и сам Делфи), так что хук ставится.
-
> хочу заблокировать запуск Блокнота
Это ты сам додумался, что с пом. этого хука можно чего-то там "блокировать" ? Или какой-то идиот тебе это подсказал ?
-
> Trible (23.10.08 17:11)
с помощью ловушек надо отслеживать момент появления нужных окон, потом зная окно, надо выяснять какому процессу оно принадлежит и далее разбираться с процессом - убивать и т.д.
-
> DVM © (23.10.08 21:13) [4]
> надо отслеживать момент появления нужных окон
Не надо их отслеживать. Уже на момент загрузки глобального хук-модуля можно узнать, в чьё АП модуль загружен. Этого вполне достаточно.
> Trible (23.10.08 17:37) [2]
> Почему - не могу понять
Потому что процесс Блокнота создает окно с совсем другой подписью и уже в ходе последующей работы меняет подпись созданного ранее окна на ту которую ты лицезреешь.
-
> Сергей М. © (24.10.08 09:45) [5] > Потому что процесс Блокнота создает окно с совсем другой > подписью и уже в ходе последующей работы меняет подпись > созданного ранее окна на ту которую ты лицезреешь.
Хорошо, тогда как блокировать окна, заголовок которых заранее известен и не меняется (например у системных диалогов Открыть/Сохранить). Конкретно, как заблокировать диалоги, заголовок окна которых начинается на "Открыть" и "Сохранить", дайте пожалуйста рабочий пример кода.
Спасибо.
-
Что значит "заблокировать" ?
ты вообще представляешь себе, чем чреваты твои попытки "блокировки" ?
Видимо, не представляешь ..
-
> Что значит "заблокировать" ? > ты вообще представляешь себе, чем чреваты твои попытки "блокировки" > Видимо, не представляешь ..
Задача стоит в блокировании ВСЕХ диалогов открытия/сохранения, для ВСЕХ программ запущенных в пользовательской сессии.
-
> Trible
Вот тебе картина маслом: некая программа пытаясь создать окно вызывает ф-цию CreateWindow[Ex], ожидая результатом хэндл созданного окна, чтобы дальше, в соответствии с предусмотнренным алгоритмом, взаимодействовать с этим окном. А вместо хэндла программа получает хрен с редькой, потому что ты в своем хуке запретил создание этого окна. А программа ждала не хрен, а хэндл, и в ее алгоритме не предусмотрена адекватная реакция на такой неожиданный поворот событий. Как, по-твоему, при этом должна повести себя программа ? На основании чего ты уверен, что программа тихо и незаметно для пользователя завершится ?
-
> Trible (24.10.08 11:10) [8]
Чем вызвана такая блажь ?
-
> Чем вызвана такая блажь ?
Список приложений пользователя ограничен искусственно, поэтому врядли попадется строптивая программа.
В сервере терминалов вызывается одна-единственная программа, 1С 8.1, и в зависимости от залогинившегося пользователя надо запретить диалоги открытия/сохранения. Стандартными способами (через 1С) это нельзя сделать.
И блокировать надо не программу целиком, а только окно диалога прибивать, который программа создает.
-
Так речь-то, оказывается, идет всего лишь навсего о ролевом конфигурировании польз.интерфейса 1С-клиента ?
Ну и за каким лешим ты полез в хук-дебри, если речь идет о штатных возможностях 1С-системы ?
-
Штатно нельзя запретить пользователям диалоги открытия/закрытия в 1С.
-
-Почему у меня болит ж**а? -А это Плохиш тебе гланды удалил. © Шматрица :)
-
> Trible (24.10.08 12:32) [13]
Да ты что ?!
А мужики-то и не знали)
-
> Сергей М. © (24.10.08 12:57) [15] > Да ты что ?! > > А мужики-то и не знали)
Ну факт есть факт, надо запретить эти диалоги. Раз сам 1С не позволяет это сделать, то внешними средствами как-то пытаюсь.
-
> Раз сам 1С не позволяет это сделать
Что, вот прямо так она тебе и сказала - "не позволяю это сделать" ?
-
> Что, вот прямо так она тебе и сказала - "не позволяю это > сделать" ?
Нет функции отключения функции вызова диалогов для определенных пользователей. То есть теоретически для пользователя эти диалоги доступны всегда.
Даже если соответствующие меню/кнопки недоступны, пользователь всегда может включить их отображение, и вызвать их. Или использовать горячие клавиши.
-
Какой такой "функции" ?
Я тебе не про ран-тайм говорю, а про дизайн-тайм, т.е. про режим создания/модификации конкретной конфигурации, в этом режиме можно сконфигурировать ролевые интерфейсы для пользователей и групп
-
> режим создания/модификации конкретной конфигурации, в этом > режиме можно сконфигурировать ролевые интерфейсы для пользователей > и групп
Нельзя сконфигурировать роль таким образом, чтоб запретить эти диалоги (так, чтоб находчивые пользователи не могли их сами включить).
-
Открыть/сохранить что конкретно ? И чем собссно чреват доступ к этим диалогам ?
-
> Открыть/сохранить что конкретно ? открытый пользователем документ. Через пункт "Файл" -> "Сохранить.."
> И чем собссно чреват доступ к этим диалогам ? Тем, что для пользователя это стандартное окно открытия/сохранения все равно что проводник - можно ходить по файлам и папкам, доступно контекстное меню для файлов, можно запускать файлы на исполнение или открывать документы. Можно даже вручную указывать путь к папке, которую хотят просмотреть; а лучше ведь скрыть все структуру ФС от пользователя, которому ничего не полагается делать на терминале, а только работать в 1С с заранее установленным списком документов.
-
Ясно.
Ну и зачем для этого "блокировать" окно ?
Достаточно принять меры по деактивации соотв.элементов меню и кнопок быстрого доступа в панели инструментов.
-
> А программа ждала не хрен, а хэндл, и в ее алгоритме не > предусмотрена адекватная реакция на такой неожиданный поворот > событий. > Как, по-твоему, при этом должна повести себя программа ? >
вообще то такие программы удалять надо не задумываясь
-
> Ну и зачем для этого "блокировать" окно ? > Достаточно принять меры по деактивации соотв.элементов меню > и кнопок быстрого доступа в панели инструментов.
Блокировать окно - универсальный путь, иначе придется блокировать все по отдельности (пункты меню, кнопки на панели инструментов, горячие клавиши). Причем, стандартными средствами 1С не удается блокировать доступ к этим элементам - для роли просто нет такого правила.
-
> Trible (27.10.08 12:35) [25]
Ну приспичило тебя "блокировать" именно окно - блокируй, я ж не против.. Я просто предупредил тебя, что не всяккое подобного рода "хирургическое вмешательство" обходится без последствий
-
> Сергей М. © (27.10.08 13:53) [26] > Ну приспичило тебя "блокировать" именно окно - блокируй, > я ж не против..
Ну так вот, как это сделать ;) Как блокировать хотя бы диалоги открытия/сохранения?
-
Ну вот прямо так и делай - с пом. HCBT_CREATEWND
-
А вообще, если диалоги открытия/сохранения стандартные, то копать следует совсем другой огород - перехват вызовов Get[Open|Save]FileName модуля commdlg32
|