|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Banned
[+4 01.02.09]
[+1 01.02.09] |
отключить кнопку контекстного меню (Zink)
Отключил в Цинке правую кнопку мыши (ignored), и конечно, по правому клику меню не выскакивает...
Но на клавиатуре есть кнопка контекстного меню (у меня слева от правого контрола, код 93) и при нажатии на ней меню флеш-плеера как миленькое вылазит. Более того, эта кнопка не отлавливаетя в Цинке (хотя отлавливается в среде фле-редактора): Как заблокировать? |
|
|||||
Banned
[+4 01.02.09]
[+1 01.02.09] |
Что такое хук?
NB! Интересное наблюдение. StandAlone плеер (флеша, а не цинка) перехватывает onKeyDown нажатие клавиши контекстного меню (выдает ее код и само меню не открывается). А вот ActiveX плеер (в ИЕ и Цинке) не отлавливает onKeyDown и открывает меню. |
|
|||||
listener
|
хук - это hook. чти Win32 API. своего рода листенер. только слушает он системные сообщения. разные. кнопка "меню" - это семечки...
но с подменой оконной процедуры проще. Последний раз редактировалось alexcon314; 20.03.2008 в 01:13. |
|
|||||
Banned
[+4 01.02.09]
[+1 01.02.09] |
Что-то никак не пойму, как dll-файл подключить в цинке.
пишу в начале флешки: файл имя_моей_библиотеки.dll лежит отдельно рядом с флешкой и цинковским экзешником. При сборке пишет ошибку: не удалось найти компонент bpl... Как dll подключить? Может его внедрять надо в экзешник как-то? |
|
|||||
Banned
[+4 01.02.09]
[+1 01.02.09] |
1. все работает (в смысле приложение, а запрет кнопки контекстного меню как раз не работает) и с этой строчкой (просто сообщение перед запуском выскакивало)
2. Собиралось как раз в дельфи, программист исправил, теперь сообщение не возникает. 3. Не понял насчет экзе? Работает нормально. 4. цинк 2.5.0.18 мне казалось, что в цинке достаточно вот эту строчку прописать в самом начале кода и при выходе выполнить И все. Но что-то пока не выходит. Может надо выполнить DLL.call()? А как узнать что dll-ка загрузилась? |
|
|||||
listener
|
>>мне казалось, что в цинке достаточно вот эту строчку прописать
Код: myDLL = new mdm.DLL("имя_моей_библиотеки.dll")в самом начале кода и при выходе выполнить Код: myDLL.close();>> так и надо поступать. myDll.call() вызываем по небходимости вызова длл-ной функции, не забывая про список параметров. у меня версия 2.5.0.34, чего и вам желаю только true isLoaded будет при реалной загрузке. если длл уже в оперативке (как например системная какая-нибудь) будет false. но работать все равно должно. если есть сомнения в работоспособности кода в длл - дебажить надо и все. как - это вопрос отдельный. элементарно: встроить в код длл какой-нибудь мессаджбокс, чтоб выскакивал в нужном месте. ну или debag tools разного рода юзать. // в длл встраиваем такие функции. ReplaceWndProc вызываем из цинка или //сразу при загрузке длл из EntryPoint. //предварительно надо найти окно плеера в цинке LRESULT CALLBACK GetMsgProc(HWND hWnd,UINT nMsg,WPARAM wParam,LPARAM lParam){ switch (nMsg) { case WM_MOUSEMOVE: // ... break; case WM_MBUTTONUP: // ... break; case WM_RBUTTONUP: // ... break; case WM_LBUTTONDBLCLK: // ... break; case WM_SYSKEYDOWN: // ... break; case WM_KEYDOWN: switch (wParam) { case VK_LEFT: break; case VK_RIGHT: break; case VK_UP: break; case VK_DOWN: break; case VK_HOME: break; case VK_END: break; case VK_INSERT: break; case VK_DELETE: break; case VK_F2: break; case VK_LWIN: //MessageBox(hwin,(LPCSTR)"left winbuttonb down","",MB_OK); break; case 93:// это и есть кнопка "меню" //MessageBox(hwin,(LPCSTR)"menubutton down","",MB_OK); return 1; // прекращаем обработку сообщения, меню не вываливается break; default: // break; } default: // break; } // передаем все далее родной процедуре на обработку return CallWindowProc((WNDPROC)oldWnd, hwin, nMsg, wParam, lParam); } // поиск окна плеера fName - заголовок (title) формы приложения // имя класса окна плеера можно узреть в WinSpector'e, например. HWND fwin = FindWindow(NULL,fName); HWND tpan = FindWindowEx(fwin,NULL,(LPCSTR)"TPanel",NULL); hwin = FindWindowEx(tpan,NULL,(LPCSTR)"FlashPlayerControl_MacromediaFlashPlayerActiveX_7309416",NULL); // собственно подмена оконной процедуры extern "C" __declspec(dllexport)LONG ReplaceWndProc(BOOL bSet){ if(bSet){ oldWnd = SetWindowLong(hwin, GWL_WNDPROC, (LONG)GetMsgProc); return oldWnd; } else{ return SetWindowLong(hwin, GWL_WNDPROC, oldWnd); } } Вариант с хуком принципиально не отличается. вместо подмены надо юзать SetWindowsHookEx(WH_GETMESSAGE, hpHookProc, hHookDll, hthread); Последний раз редактировалось alexcon314; 25.03.2008 в 12:54. |
|
|||||
Banned
[+4 01.02.09]
[+1 01.02.09] |
Спасибо!
Видно дело именно в запрятанном окне цинка (dll-ка была рассчитана на стандартное приложение) Будем искать А теперь такой вопрос: dll подгружается извне, поэтому возможна ситуация, когда пользователь сможет запустить экзешник без dll-ки и нажав на кнопку контекстного меню увидит-таки флешовое окно. Можно ли внедрить dll прямо в экзешник? |
|
|||||
listener
|
это предусмотрено в механизме создания и внедрения в ехе собственных расширений (в триале недоступно).
вариант: зашить длл в библиотеку (цинк, не путать с флэш-библиотекой) приложения и программно ее распаковывать при старте. далее подрубать длл как обычно из каталога распаковки. (я не пробовал). вариант с отсутствующей длл, о котором вы говорите, мне представляется маловероятным, ибо распространять приложение вы будете вместе с ней и никак иначе(?), одним инсталл-пакетом, возможно, благо такие возможности у цинка есть. зачем юзеру париться и запускать ехе без длл? ... впрочем, вам виднее. Последний раз редактировалось alexcon314; 25.03.2008 в 13:50. |
Часовой пояс GMT +4, время: 16:56. |
|
« Предыдущая тема | Следующая тема » |
|
|