Chertenok.ru - все о программировании
Вход  |  Регистрация  |  Поиск 
Праздник
Завтра :

День славянской письменности и культуры


Полупрозрачное меню
На страницу 1, 2  След.

Новая тема  Ответить  Печать Предыдущая тема  Следующая тема
Автор Сообщение
Пол:Муж Evgeny
Постоянный участник


Возраст: 51
Знак зодиака: Козерог
Зарегистрирован: 26.06.2005
Сообщения: 152
Откуда: Омск
СообщениеПн, 17-Дек-2007 15:53    Заголовок сообщения: Полупрозрачное меню
Цитата

В хуке устанавливается степень прозрачности для меню. Меню показывается полупрозрачным только, если работать в отладчике. При обычном запуске никакого эффекта. В тоже время диалоговое окно у которого прозрачность устанавливается в событии 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
Великий гонщик

Предупреждений : 1
Возраст: 26
Знак зодиака: Рыбы
Зарегистрирован: 12.09.2005
Сообщения: 714
Откуда: Великий город Рига... =Ъ
СообщениеСб, 29-Дек-2007 22:28 
Цитата

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


Возраст: 51
Знак зодиака: Козерог
Зарегистрирован: 26.06.2005
Сообщения: 152
Откуда: Омск
СообщениеВс, 30-Дек-2007 0:28 
Цитата

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

Предупреждений : 1
Возраст: 26
Знак зодиака: Рыбы
Зарегистрирован: 12.09.2005
Сообщения: 714
Откуда: Великий город Рига... =Ъ
СообщениеСб, 05-Янв-2008 5:46 
Цитата

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

Хотя в твоём примере используется локальный хук на программу, но всё-равно он ставится на всю ОС просто сообщения фильтруются на уровне ОС и программе достаётся только те команды чей hInstance равен установщику хука...

У меня например пульт от тюнера, по всему компу используется.... Я просто поставил Hook на определённое скрытое окно, и тащу сообщения... Потом уж решается посылать команду тюнеру или уже моей программе.....

_________________
В начало
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Пол:Муж Evgeny
Постоянный участник


Возраст: 51
Знак зодиака: Козерог
Зарегистрирован: 26.06.2005
Сообщения: 152
Откуда: Омск
СообщениеСб, 05-Янв-2008 11:20 
Цитата

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

Предупреждений : 1
Возраст: 26
Знак зодиака: Рыбы
Зарегистрирован: 12.09.2005
Сообщения: 714
Откуда: Великий город Рига... =Ъ
СообщениеСб, 05-Янв-2008 22:24 
Цитата

Что-бы хук работал его сначало надо установить...

Делается это командой 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
Откуда: Омск
СообщениеВс, 06-Янв-2008 0:06 
Цитата

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

Предупреждений : 1
Возраст: 26
Знак зодиака: Рыбы
Зарегистрирован: 12.09.2005
Сообщения: 714
Откуда: Великий город Рига... =Ъ
СообщениеВс, 06-Янв-2008 8:16 
Цитата

Тупо воспользовался поиском...

Нашол этот-же пример.... И он у меня нормально работал....

http://www.delphisources.ru/pages/faq/base/win2000_xp_trans_menu.html

_________________
В начало
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Пол:Муж Evgeny
Постоянный участник


Возраст: 51
Знак зодиака: Козерог
Зарегистрирован: 26.06.2005
Сообщения: 152
Откуда: Омск
СообщениеВс, 06-Янв-2008 12:25 
Цитата

Цитата:
Тупо воспользовался поиском...


Мне не приходилось так пользоваться поиском, для этого мне достаточно открыть DelphiWorld. Но факт остается фактом. Я не знаю в VCL вы делали пример или в WinAPI, но у меня данный пример по какой-то причине работает нестабильно и это так.

Добавлено спустя 4 минуты 2 секунды:

Кстати указанный вами пример взят оттуда, даже анекдот остался на месте.

_________________
Здесь Вы там не найдете
В начало
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Пол:Муж TuXAPuK
Великий гонщик

Предупреждений : 1
Возраст: 26
Знак зодиака: Рыбы
Зарегистрирован: 12.09.2005
Сообщения: 714
Откуда: Великий город Рига... =Ъ
СообщениеВс, 06-Янв-2008 18:43 
Цитата

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
Откуда: Омск
СообщениеВс, 06-Янв-2008 21:29 
Цитата

Не уверен, что это важно, так как должно работать и под NT, но вот:

"Version 5.1 (Build 2600.xpsp_sp2_rtm.040803-2158 : Service Pack 2)"

_________________
Здесь Вы там не найдете
В начало
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Пол:Муж Evgeny
Постоянный участник


Возраст: 51
Знак зодиака: Козерог
Зарегистрирован: 26.06.2005
Сообщения: 152
Откуда: Омск
СообщениеПн, 07-Янв-2008 14:42 
Цитата

Вот набросал небльшой пример, с использованием вышеуказанного кода. И снова popup-menu становится прозрачным только, если "прошагивать" программу.


test.rar
 Описание:

Скачать
 Имя файла:  test.rar
 Размер:  1.77 KB
 Загружен:  275 раз(а)


_________________
Здесь Вы там не найдете
В начало
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Пол:Муж TuXAPuK
Великий гонщик

Предупреждений : 1
Возраст: 26
Знак зодиака: Рыбы
Зарегистрирован: 12.09.2005
Сообщения: 714
Откуда: Великий город Рига... =Ъ
СообщениеПт, 11-Янв-2008 10:57 
Цитата

Как-бы всё работает... Исходник, программа (*.-exe) и скриншоты в архиве...

ЗЫ: (Извините, вы достигли максимального ограничения квоты закачек: 2 MB) Обидно :(

Залил на http://filefactory.ru/1200042224/AlphaMenuApp.rar

_________________
В начало
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Пол:Муж Evgeny
Постоянный участник


Возраст: 51
Знак зодиака: Козерог
Зарегистрирован: 26.06.2005
Сообщения: 152
Откуда: Омск
СообщениеПт, 11-Янв-2008 12:32 
Цитата

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


Возраст: 26
Знак зодиака: Овен
Зарегистрирован: 18.03.2005
Сообщения: 2137

СообщениеПт, 11-Янв-2008 13:05 
Цитата

может стоит запустить из под админа? )
_________________
Сила дурака в том, что умный перед ним бессилен.
В начало
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Страница 1 из 2 На страницу 1, 2  След.
Перейти:  
Новая тема  Ответить  Печать

Вы можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете присоединять файлы в этом форуме
Вы можете скачивать файлы в этом форуме
хостинг от .masterhost 
Rambler's Top100