![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запрет всех контекстных меню ;в системе (ловушка) [D7, Win95/98, WinME, NT4, Win2k, WinXP]
_ALEXey_ © (2003-04-09 19:03:00)Здравствуйте, мастера и все, кто читает мой вопрос!
Вот какой вопрос меня интересует:
Есть библиотека, в ней - ловушка, которая должна запрещать показ всех всплывающих меню в системе. Запретить не удалось, а вот при выводе тут же его убрать можно. Код приведен ниже. Но вот незадача! менюшка, появляясь, и, тут же, исчезая, создает некрасивый эффект мерцания. В том-то и вопрос: как от этого избавиться ?Может посоветуете какие-нибудь иные способы решения этой задачи...
library Hooks;
uses
Windows,
Messages;
var
PopupMenuH: THandle;
{$R *.res}
function PopupMenuHook(Code, wParam, lParam: Integer): LResult; stdcall;
var
Param: ^MSG;
begin
Result:= 1;
If Code >= 0
then begin
Param:= Pointer(lParam);
If Code = MSGF_MENU
then SendMessage(Param^.hwnd, WM_CANCELMODE, 0, 0)
else Result:= CallNextHookEx(PopupMenuH, Code, wParam, lParam);
end
else
Result:= CallNextHookEx(PopupMenuH, Code, wParam, lParam);
end;
function SetPopupMenuHook: Boolean;
begin
Result:= True;
PopupMenuH:= SetWindowsHookEx(WH_SYSMSGFILTER, @PopupMenuHook, hInstance, 0);
If PopupMenuH = 0 then
Result:= False;
end;
procedure RemovePopupMenuHook;
begin
UnhookWindowsHookEx(PopupMenuH);
end;
exports
SetPopupMenuHook Name "SetPopupMenuHook",
RemovePopupMenuHook Name "RemovePopupMenuHook";
end.
Songoku (2003-04-18 10:17:00) [1]> Almaz ©
Как загрузить 1ую функцию по индексу из Kernel32.dll???(Win9x)
Вопрос такой как отключить только немю каторое выскакивает по нажатию кпопки Start(Пуск) либо WIN_R(WIN_L) ?????
_ALEXey_ (2003-04-18 07:30:00) [2]
> А можно немного оторвать вас от возвышенных материй
> попробуйте прописать нижеследующее NoTrayContextMenu = 1
> NoViewContextMenu = 1 (Запретить контекстное меню на трее
> и Запретить контекстное меню) в реестр, ветка HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion
> \Policies\Explorer , и меню перестанут появляться. Это конечно
> не столь круто как перехват системных функций :о) , но знаетели
> работает .
Это работает, безусловно! Но только в проводнике (Explorer), а задача состояла в том, чтобы убрать их изо всех приложений.
Diamond Cat (2003-04-18 01:39:00) [3]да, извините, забыл добавить что параметры эти строковые
Diamond Cat (2003-04-18 01:30:00) [4]А можно немного оторвать вас от возвышенных материй
попробуйте прописать нижеследующее NoTrayContextMenu = 1 NoViewContextMenu = 1 (Запретить контекстное меню на трее и Запретить контекстное меню) в реестр, ветка HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion
\Policies\Explorer , и меню перестанут появляться. Это конечно не столь круто как перехват системных функций :о) , но знаетели работает .
удачи
Songoku (2003-04-17 20:34:00) [5]Коаго интересует тема:
"Система перехвата функций API платформы Win32."
Есть очень интересная статья об этом.
А вот собственно и адрес: http://wasm.ru/print.php?article=1021007
p.s. Я даже себе её разпичатал и повечерам кагда не чего делать читаю её!!!
Song (2003-04-17 19:38:00) [6]Вероятно у него другой класс. Посмотри WinSight"ом.
_ALEXey_ (2003-04-17 17:24:00) [7]
> Almaz ©
Спасибо! Заработало!
Благодарю всех за помощь!
Правда глюки остались: в Delphi 7, Office XP - меню все равно появляется. Вероятно, у них это устроено по-другому. Я пытался убрать главное меню с помощьюSetMenu- такая же история: почти во всех окнах убирается, а в Делфи и Офисе - нет! Дескриптор меню = 0, а оно доступно и работает!
Almaz (2003-04-17 01:24:00) [8]
> ALEXey_ © (16.04.03 18:21)
Попробуйте так:
function Hook(Code: Integer; ParamW: WPARAM; ParamL: LPARAM): LRESULT; stdcall;
var
Buffer: array [0..7] of Char;
begin
if Code = HCBT_CREATEWND then
begin
GetClassName(ParamW, Buffer, sizeof(Buffer));
if Buffer = "#32768" then
begin
Result := 1;
Exit;
end;
end;
Result := CallNextHookEx(OldHook, Code, ParamW, ParamL);
end;
Удачи.
_ALEXey_ (2003-04-16 18:21:00) [9]
> Morfein © (12.04.03 20:50)
> Хуком получится, но только не этим... надо ставить хук WH_CBT,
> отлавливать создание окон и классом "#327**" (вместо звёздочек
> - цифры, точно не помню, какие) и запрещать их создавать...
> менюшки исчезают начисто, без перехвата вызовов функций!
Попробовал так, вот что получилось:
function PopupMenuHook(Code, wParam, lParam: Integer): LResult; stdcall;
var
CBTCrtWnd: ^CBT_CREATEWND;
CrtStrct: ^CREATESTRUCT;
WndClass: PChar;
begin
If Code >= 0
then begin
If Code = HCBT_CREATEWND
then begin
CBTCrtWnd:= Pointer(lParam);
CrtStrct:= Pointer(CBTCrtWnd^.lpcs);
WndClass:= CrtStrct^.lpszClass;
If WndClass = "#32768"
then Result:= 1
else Result:= CallNextHookEx(PopupMenuH, Code, wParam, lParam);
end
else Result:= CallNextHookEx(PopupMenuH, Code, wParam, lParam);
end
else begin
Result:= CallNextHookEx(PopupMenuH, Code, wParam, lParam);
Exit;
end;
end;
Однако, при попытке создания любого окна выдается сообщение:
"Инструкция хххххххх обратилась по адресу хххххххххх ... память не может быть "read""
И при этом исчезает таскбар и виснет Explorer (винда - 2000-я).
Подскажите пожалуйста, где ошибка?
NightAngel (2003-04-13 01:15:00) [10]> Almaz © (13.04.03 00:20)
Речь не идет об ОБРАБОТЧИКЕ речь идет о модификации кода
вызываемой функции.
Извиняюсь, ошибся.
Согласен, данный пример написан под NT платформы. Для Win9x платформ придется вносить изменения в таблицу импорта модулей процесса, что также не очень сложно.
Этого делать не обязательно. Можно использовать Ваш пример и под Win9x. Документированный Windows API не предоставляет средств для внесения изменений в память >2Gb, VirtualProtect + WriteProcessMemory завершается неудачно, однако эту проблему можно решить и без написания собственного VxD. Достаточно вызвать VxDCall0 _PageModifyPermissions. VxDCall0 - это ВСЕГДА ПЕРВАЯ экспортируемая Kernel32.dll функция.
Almaz (2003-04-13 00:32:00) [11]
> Morfein © (12.04.03 20:50)
> Хуком получится, но только не этим... надо ставить хук WH_CBT,
> отлавливать создание окон и классом "#327**" (вместо звёздочек
> - цифры, точно не помню, какие) и запрещать их создавать...
> менюшки исчезают начисто, без перехвата вызовов функций!
#327 68:) Согласен - это неплохой вариант.
Удачи.
Almaz (2003-04-13 00:20:00) [12]
> NightAngel (12.04.03 23:11)
> > Almaz © (11.04.03 01:31)
> Пример который Вы привели не будет работать в Win9x, т.к.
> в системах Win9x некоторые системные библиотеки (kernel32,
> user32 и др.) загружаются в адресное пространство >2Gb,
> которое проецируется НА ВСЕ контексты, присутствующие в
> системе. Это усложняет процесс перехвата их функций, так
> как содержимое памяти свыше 2Gb НЕ МОЖЕТ БЫТЬ ИЗМЕНЕНО стандартными
> документированными API функциями.
Согласен, данный пример написан под NT платформы. Для Win9x платформ придется вносить изменения в таблицу импорта модулей процесса, что также не очень сложно.
> NightAngel (12.04.03 23:29)
> И ещё...
> После установки атрибута "writable" на необходимый регион
> памяти и осуществления записи в него, изменения произойдут
> ВО ВСЕХ присутствующих контекстах одновременно. Значит,
> код обработчикадолжен располагаться по одинаковым адресам
> ВО ВСЕХ контекстах. Это возможно только если код будет находиться
> выше 2Gb.
Речь не идет об ОБРАБОТЧИКЕ речь идет о модификации кода вызываемой функции.
NightAngel (2003-04-12 23:29:00) [13]И ещё...
После установки атрибута "writable" на необходимый регион памяти и осуществления записи в него, изменения произойдут ВО ВСЕХ присутствующих контекстах одновременно. Значит, код обработчика должен располагаться по одинаковым адресам ВО ВСЕХ контекстах. Это возможно только если код будет находиться выше 2Gb.
NightAngel (2003-04-12 23:11:00) [14]> Almaz © (11.04.03 01:31)
Пример который Вы привели не будет работать в Win9x, т.к. в системах Win9x некоторые системные библиотеки (kernel32, user32 и др.) загружаются в адресное пространство >2Gb, которое проецируется НА ВСЕ контексты, присутствующие в системе. Это усложняет процесс перехвата их функций, так как содержимое памяти свыше 2Gb НЕ МОЖЕТ БЫТЬ ИЗМЕНЕНО стандартными документированными API функциями.
Morfein (2003-04-12 20:50:00) [15]Хуком получится, но только не этим... надо ставить хук WH_CBT, отлавливать создание окон и классом "#327**" (вместо звёздочек - цифры, точно не помню, какие) и запрещать их создавать... менюшки исчезают начисто, без перехвата вызовов функций!
Song (2003-04-12 09:36:00) [16]А хуком не получится? WM_CONTEXTMENU, WM_INITPOPUPMENU, WM_ENTERMENULOOP/WM_EXITMENULOOP ...
Нууу (2003-04-12 03:50:00) [17]>Almaz © (11.04.03 23:21)
>> Vlad Oshin © (11.04.03 08:23)
>> Вам бы статью по этому поводу написать.
>Будет время - непременно :)
Ага! А потом будете тратить весь свой траффик на напоминание ссылки на эту статью! В нынешнее время - мало кто читает статьи (УВЫ).
А посему согласен с Вами. (Будет "лишнее" время - "может быть"). :(((
Almaz (2003-04-11 23:21:00) [18]
> Vlad Oshin © (11.04.03 08:23)
> Вам бы статью по этому поводу написать.
Будет время - непременно :)
> _ALEXey_ © (11.04.03 10:15)
> Almaz, благодарю за помощь! Честно говоря, я о таком способе
> не думал. Может подскажете, где можно найти описание всех
> функций, реализованных в подобных модулях (user32.dll, ...)?!
Эти модули - стандартные библиотеки Win32. Полное их описание, как уже было сказано DVM © содержиться в Microsoft Development Network - MSDN ( http://msdn.microsoft.com).
Если просто хотите посмотреть список функций, реализованных в том или ином модуле, то можно воспользоваться утилитойtdump.exe
Кроме того существует очень неплохая книга-справочник по этим функциям, которые кстати именуются WinAPI :) К сожалению, я не помню имени автора, но название книги "Справочник по API функциям Windows 2000".
Удачи.
DVM (2003-04-11 10:33:00) [19]
> Может подскажете, где можно найти описание всех
> функций, реализованных в подобных модулях (user32.dll, ...)?!
Как где? F1, MSDN, Книжки по WinApi. А вообще то нормальной документации на русском языке нет. Да и на английском, наверное только у Microsoft есть нормальная.
user32.dll, kernel32.dll, gdi.32.dll, shell32.dll - почти по 1000 функций в XP содержат. Это ж какой объем!
_ALEXey_ (2003-04-11 10:15:00) [20]Almaz, благодарю за помощь! Честно говоря, я о таком способе не думал. Может подскажете, где можно найти описание всех функций, реализованных в подобных модулях (user32.dll, ...)?!