| Автор
| Сообщение |
 Evgeny
Постоянный участник

Возраст: 51
Знак зодиака: 
Зарегистрирован: 26.06.2005
Сообщения: 152
Откуда: Омск
|
|
|
Цитата |
|
В хуке устанавливается степень прозрачности для меню. Меню показывается полупрозрачным только, если работать в отладчике. При обычном запуске никакого эффекта. В тоже время диалоговое окно у которого прозрачность устанавливается в событии WM_INITDIALOG работает нормально. Перерыл все ссылки, везде приводится подобный код, но почему не работает - не пойму.
// function to make the menu transparent
function MakeWndTrans(Wnd : HWND; nAlpha : Integer = 10) : Boolean;
var
aStyle : Integer;
begin
Result := False;
if Assigned(SetLayeredWindowAttributes) then
begin
aStyle := GetWindowLong(Wnd, GWL_EXSTYLE);
if (aStyle and WS_EX_LAYERED) = 0 then
begin
SetWindowLong(Wnd, GWL_EXSTYLE, aStyle or WS_EX_LAYERED);
SetLayeredWindowAttributes(Wnd, 0, Trunc((255 / 100) * (100 - nAlpha)), LWA_COLORKEY or LWA_ALPHA);
Result := True;
end
else
begin
SetWindowLong(Wnd, GWL_EXSTYLE, aStyle and not WS_EX_LAYERED);
RedrawWindow(Wnd, NIL, 0, RDW_ERASE or RDW_INVALIDATE or RDW_FRAME or RDW_ALLCHILDREN);
end;
end;
end;
function HookCallWndProc(nCode: Integer; wParam, lParam: Longint): Longint; stdcall;
const
N_ALPHA = 30;
var
cwps : TCWPStruct;
szClass : array[0..8] of char;
begin
if (nCode = HC_ACTION) then
begin
CopyMemory(@cwps, Pointer(lParam), SizeOf(CWPSTRUCT));
case cwps.message of
WM_CREATE:
begin
GetClassName(cwps.hwnd, szClass, Length(szClass)-1);
// Window name for menu is #32768
if (lstrcmpi(szClass, MENU_CLASS) = 0) then
MakeWndTrans(cwps.hwnd, N_ALPHA);
end;
end;
end;
// Call the next hook in the chain
Result := CallNextHookEx(WH_CALLWNDPROC, nCode, wParam, lParam);
end;
_________________ Здесь Вы там не найдете |
|
| В начало |
|
 |
|
|
 |
 TuXAPuK
Великий гонщик


Возраст: 26
Знак зодиака: 
Зарегистрирован: 12.09.2005
Сообщения: 714
Откуда: Великий город Рига... =Ъ
|
|
|
Цитата |
|
Вауу... Какая офигенная новость - этот пример ещё месяца 2-3 назад весь нет облетел.... Только есть одно маленькое но... Хуки ставить последнее дело... Ибо каждый хук притормаживает работоспособность всего компьютера.... Даже если это внутренний хук программы всё-равно он на всю ось ставится... Второй минус - то что под Windows 9x он подвешивает комп...
_________________
 |
|
| В начало |
|
 |
 Evgeny
Постоянный участник

Возраст: 51
Знак зодиака: 
Зарегистрирован: 26.06.2005
Сообщения: 152
Откуда: Омск
|
|
|
Цитата |
|
Естественно, где еще примеры брать. Но кричать "Вау" большого ума не нужно, а вот подсказать тут-то знания и нужны. И не плохо заглянуть в потроха Delphi, он весь на хуках сидит и ничего не притормаживает. Да заодно и Гейтцу можно письмо написать, чего это он всю операционку на хуках держит, они ведь ПОДТОРМАЖИВАЮТ, глядишь и прислушается совета знатока, исправит свою глюки.
_________________ Здесь Вы там не найдете |
|
| В начало |
|
 |
 TuXAPuK
Великий гонщик


Возраст: 26
Знак зодиака: 
Зарегистрирован: 12.09.2005
Сообщения: 714
Откуда: Великий город Рига... =Ъ
|
|
|
Цитата |
|
Без хуков компьютер потерял полноценную связь между программами... Просто надо со знанием использовать хуки - там где они действительно нужны... И не делать подобных глупостей....
Хотя в твоём примере используется локальный хук на программу, но всё-равно он ставится на всю ОС просто сообщения фильтруются на уровне ОС и программе достаётся только те команды чей hInstance равен установщику хука...
У меня например пульт от тюнера, по всему компу используется.... Я просто поставил Hook на определённое скрытое окно, и тащу сообщения... Потом уж решается посылать команду тюнеру или уже моей программе.....
_________________
 |
|
| В начало |
|
 |
 Evgeny
Постоянный участник

Возраст: 51
Знак зодиака: 
Зарегистрирован: 26.06.2005
Сообщения: 152
Откуда: Омск
|
|
|
Цитата |
|
Ну и смысл во всем этом? Известно же, что пример не мой, им заполнены все сайты, а толку. Прмер то не рабочий. А вот как сделать, чтобы он заработал... Ну а сентенции по хукам смысла нет разводить. Знаете как сделать без них, напишите, нет, что флуд разводить.
_________________ Здесь Вы там не найдете |
|
| В начало |
|
 |
 TuXAPuK
Великий гонщик


Возраст: 26
Знак зодиака: 
Зарегистрирован: 12.09.2005
Сообщения: 714
Откуда: Великий город Рига... =Ъ
|
|
|
Цитата |
|
Что-бы хук работал его сначало надо установить...
Делается это командой SetWindowsHookEx, удаляется UnhookWindowsHookEx
Описание : http://trubetskoy1.narod.ru/translate/Hooks.html
MENU_CLASS производится кажись от TMainMenu.ClassName; если нет то WINSPYXX (Из MSFT VC++ 6 Tools) может тебе показать имя класса твоего меню....
Добавлено спустя 5 минут 54 секунды:
ЗЫ : Что-бы не долбать систему хуками нужно создать TMenuItem и при действии Сreate воспользоваться
"function GetHandle: HMENU;"
Потом уже
"function MakeWndTrans(Wnd : HWND; nAlpha : Integer = 10) : Boolean;" из твоего примера...
ЗЫЫ: HWND и HMENU это практически одно и то-же... Хэндл окна....
_________________
 |
|
| В начало |
|
 |
 Evgeny
Постоянный участник

Возраст: 51
Знак зодиака: 
Зарегистрирован: 26.06.2005
Сообщения: 152
Откуда: Омск
|
|
|
Цитата |
|
Да... С матчастью видать совсем плохо. Уж если MENU_CLASS стал производным от TMainMenu, то с вами все ясно. Для начала неплохо хотя бы азы WinAPI изучить, тогда таких словесных ляпов удастся избежать. Да и хук у меня в программе установлен нормально, не первый день в программировании. Я ведь писал, что в дебагере меню становится прозрачным, но только в нем, а вот остальные окна отрабатывют нормально, то есть становятся прозрачными. Но к чему весь этот флуд, ведь тема, ясно, для вас новая и вы в ней разбираетесь ОЧЕНЬ слабо. Да и в топис этот я зашел по причине, что с VCL я не работаю уже несколько лет. Так что ЗЫЫ...
_________________ Здесь Вы там не найдете |
|
| В начало |
|
 |
 TuXAPuK
Великий гонщик


Возраст: 26
Знак зодиака: 
Зарегистрирован: 12.09.2005
Сообщения: 714
Откуда: Великий город Рига... =Ъ
|
|
| В начало |
|
 |
 Evgeny
Постоянный участник

Возраст: 51
Знак зодиака: 
Зарегистрирован: 26.06.2005
Сообщения: 152
Откуда: Омск
|
|
|
Цитата |
|
| Цитата: | | Тупо воспользовался поиском... |
Мне не приходилось так пользоваться поиском, для этого мне достаточно открыть DelphiWorld. Но факт остается фактом. Я не знаю в VCL вы делали пример или в WinAPI, но у меня данный пример по какой-то причине работает нестабильно и это так.
Добавлено спустя 4 минуты 2 секунды:
Кстати указанный вами пример взят оттуда, даже анекдот остался на месте.
_________________ Здесь Вы там не найдете |
|
| В начало |
|
 |
|
|
 |
 TuXAPuK
Великий гонщик


Возраст: 26
Знак зодиака: 
Зарегистрирован: 12.09.2005
Сообщения: 714
Откуда: Великий город Рига... =Ъ
|
|
|
Цитата |
|
| Evgeny писал(а): | | но у меня данный пример по какой-то причине работает нестабильно и это так. |
А что за OS вы используете? Лично у меня "Version 5.1 (Build 2600.xpsp_sp2_gdr.070227-2254 : Service Pack 2)" (WINVER.EXE)
PS: Когда дело касается хуков, то VCL я не использую, и стараюсь выдрать из классов всё содержимое что-бы не нагружать лишних библиотек....
PSS : Первым этот пример появился в "MSDN Magazine", потом его переделали под Delphi, и он разгулялся по интернету....
_________________
 |
|
| В начало |
|
 |
 Evgeny
Постоянный участник

Возраст: 51
Знак зодиака: 
Зарегистрирован: 26.06.2005
Сообщения: 152
Откуда: Омск
|
|
|
Цитата |
|
Не уверен, что это важно, так как должно работать и под NT, но вот:
"Version 5.1 (Build 2600.xpsp_sp2_rtm.040803-2158 : Service Pack 2)"
_________________ Здесь Вы там не найдете |
|
| В начало |
|
 |
 Evgeny
Постоянный участник

Возраст: 51
Знак зодиака: 
Зарегистрирован: 26.06.2005
Сообщения: 152
Откуда: Омск
|
|
|
Цитата |
|
Вот набросал небльшой пример, с использованием вышеуказанного кода. И снова popup-menu становится прозрачным только, если "прошагивать" программу.
| Описание: |
|
 Скачать |
| Имя файла: |
test.rar |
| Размер: |
1.77 KB |
| Загружен: |
275 раз(а) |
_________________ Здесь Вы там не найдете |
|
| В начало |
|
 |
 TuXAPuK
Великий гонщик


Возраст: 26
Знак зодиака: 
Зарегистрирован: 12.09.2005
Сообщения: 714
Откуда: Великий город Рига... =Ъ
|
|
| В начало |
|
 |
 Evgeny
Постоянный участник

Возраст: 51
Знак зодиака: 
Зарегистрирован: 26.06.2005
Сообщения: 152
Откуда: Омск
|
|
|
Цитата |
|
Тогда я ничего не понимаю. Что это, капризы XP или что то еще, у меня все осталось по прежнему - как не работало, так м не работает.
_________________ Здесь Вы там не найдете |
|
| В начало |
|
 |
 NikotiN
Розовый мамонт

Возраст: 26
Знак зодиака: 
Зарегистрирован: 18.03.2005
Сообщения: 2137
|
|
|
Цитата |
|
может стоит запустить из под админа? )
_________________ Сила дурака в том, что умный перед ним бессилен. |
|
| В начало |
|
 |
|