![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Banned
[+4 01.02.09]
[+1 01.02.09] |
Отключил в Цинке правую кнопку мыши (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, время: 03:21. |
|
|
« Предыдущая тема | Следующая тема » |
|
|