Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flash Приложения: AIR, Zinc и тд. (http://www.flasher.ru/forum/forumdisplay.php?f=94)
-   -   отключить кнопку контекстного меню (Zink) (http://www.flasher.ru/forum/showthread.php?t=109715)

chingachgoog 19.03.2008 16:05

отключить кнопку контекстного меню (Zink)
 
Отключил в Цинке правую кнопку мыши (ignored), и конечно, по правому клику меню не выскакивает...
Но на клавиатуре есть кнопка контекстного меню (у меня слева от правого контрола, код 93) и при нажатии на ней меню флеш-плеера как миленькое вылазит. :(
Более того, эта кнопка не отлавливаетя в Цинке (хотя отлавливается в среде фле-редактора):

Код:

KL={}
KL.onKeyDown=function(){
        trace(Key.getCode())
        myKey.text=Key.getCode() // тестовое текстовое поле
}
Key.addListener(KL)

Как заблокировать?

alexcon314 19.03.2008 17:45

написать ДЛЛ, перехватывающую эту кнопку и подключить к цинку.
я делал подобное, подменяя оконную процедуру плеера в цинке. получалось. или же хук.

chingachgoog 19.03.2008 20:09

Что такое хук?

NB!
Интересное наблюдение. StandAlone плеер (флеша, а не цинка) перехватывает onKeyDown нажатие клавиши контекстного меню (выдает ее код и само меню не открывается).
А вот ActiveX плеер (в ИЕ и Цинке) не отлавливает onKeyDown и открывает меню.

alexcon314 19.03.2008 22:13

хук - это hook. чти Win32 API. своего рода листенер. только слушает он системные сообщения. разные. кнопка "меню" - это семечки...
но с подменой оконной процедуры проще.

chingachgoog 24.03.2008 20:36

Что-то никак не пойму, как dll-файл подключить в цинке.

пишу в начале флешки:
Код:

myDLL = new mdm.DLL("имя_моей_библиотеки.dll")
файл имя_моей_библиотеки.dll лежит отдельно рядом с флешкой и цинковским экзешником.

При сборке пишет ошибку: не удалось найти компонент bpl...

Как dll подключить? Может его внедрять надо в экзешник как-то?

alexcon314 25.03.2008 08:42

*.bpl - это из области дэлфи.
1. без этой строчки все работает?
2. что в длл? в чем собирали?
3. что в экзе?
4. версия цинка?

chingachgoog 25.03.2008 11:29

1. все работает (в смысле приложение, а запрет кнопки контекстного меню как раз не работает) и с этой строчкой (просто сообщение перед запуском выскакивало)
2. Собиралось как раз в дельфи, программист исправил, теперь сообщение не возникает.
3. Не понял насчет экзе? Работает нормально.
4. цинк 2.5.0.18

мне казалось, что в цинке достаточно вот эту строчку прописать
Код:

myDLL = new mdm.DLL("имя_моей_библиотеки.dll")
в самом начале кода и при выходе выполнить
Код:

myDLL.close();
И все. Но что-то пока не выходит.
Может надо выполнить DLL.call()?

А как узнать что dll-ка загрузилась?

alexcon314 25.03.2008 12:33

>>мне казалось, что в цинке достаточно вот эту строчку прописать

Код:
myDLL = new mdm.DLL("имя_моей_библиотеки.dll")в самом начале кода и при выходе выполнить

Код:
myDLL.close();>>
так и надо поступать. myDll.call() вызываем по небходимости вызова длл-ной функции, не забывая про список параметров.
у меня версия 2.5.0.34, чего и вам желаю :)
Код:

hDll = new mdm.DLL(dllPath);
if (!hDll.isLoaded) {
        mdm.prompt("Dll load failed!");
        return;
}

только 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);

chingachgoog 25.03.2008 13:19

Спасибо!
Видно дело именно в запрятанном окне цинка (dll-ка была рассчитана на стандартное приложение) Будем искать :)

А теперь такой вопрос:
dll подгружается извне, поэтому возможна ситуация, когда пользователь сможет запустить экзешник без dll-ки и нажав на кнопку контекстного меню увидит-таки флешовое окно. Можно ли внедрить dll прямо в экзешник?

alexcon314 25.03.2008 13:46

это предусмотрено в механизме создания и внедрения в ехе собственных расширений (в триале недоступно).
вариант: зашить длл в библиотеку (цинк, не путать с флэш-библиотекой) приложения и программно ее распаковывать при старте. далее подрубать длл как обычно из каталога распаковки. (я не пробовал).
вариант с отсутствующей длл, о котором вы говорите, мне представляется маловероятным, ибо распространять приложение вы будете вместе с ней и никак иначе(?), одним инсталл-пакетом, возможно, благо такие возможности у цинка есть. зачем юзеру париться и запускать ехе без длл? ... впрочем, вам виднее.


Часовой пояс GMT +4, время: 04:29.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.