Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flash Приложения: AIR, Zinc и тд. (http://www.flasher.ru/forum/forumdisplay.php?f=94)
-   -   Как убрать Alt-Tab в Zinc (http://www.flasher.ru/forum/showthread.php?t=106523)

Agon 13.01.2008 20:20

Как убрать Alt-Tab в Zinc
 
Нужно убрать Alt-Tab в полноэкранном приложении.
Сделал через mdm.Application.onAppChangeFocus но получается не эстетично: появляется окно выбора приложения, при выборе любого приложения, остается текущее, но иногда выскакивает меню "Пуск" и экран дергается т.к. разрешение не системное.

Прочитал здесь насчет перехвата событий через dll,
может этим путем пойти?
Хочу, чтобы ничего не появлялось, экран не мигал и т.д.

alexcon314 14.01.2008 09:21

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

BOOL RegisterHotKey(

    HWND hWnd,        // window to receive hot-key notification
    int id,        // identifier of hot key
    UINT fsModifiers,        // key-modifier flags
    UINT vk        // virtual-key code
  );

после непродолжительных поисков нашел еще
Код:

BOOL SystemParametersInfo(

    UINT uiAction,        // system parameter to query or set
    UINT uiParam,        // depends on action to be taken
    PVOID pvParam,        // depends on action to be taken
    UINT fWinIni        // user profile update flag
  );

эту функцию можно вызывать прямо из цинка, подключив user32.dll.
Цитата:

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

// Включение режима
SystemParametersInfo(SPI_SCREENSAVERRUNNING, 1, 0, 0);
// Выключение режима
SystemParametersInfo(SPI_SCREENSAVERRUNNING, 0, 0, 0);
численное представление константы SPI_SCREENSAVERRUNNING есть 97. то бишь можно вызывать так
SystemParametersInfo(97, 0, 0, 0);
...
ха-ха. под XP не катит. тогда хук ставить. про хуки см статью в ссылках по ZInc "слушаем систему". примерчик может изготовлю по-позже, но сейчас некогда.

alexcon314 15.01.2008 12:37

отключаем ALT+TAB
 
а вот и пример, все проще оказалось
Код:

// отключаем ALT+TAB
// задействуем обработчик события onAppExit чтобы при выходе все "восстановить"
 
mdm.Application.enableExitHandler();
mdm.Application.onAppExit = function() {
        UnSet();
        myDLL.close();
        mdm.Application.exit();
};
// принудительно ставим заголовок формы и приложения в таскбаре,
// чтобы по ним найти хэндл

formTitle = mdm.Forms.MainForm.title = "form";
appTitle = mdm.Application.title = "app";
// получаем хэндл окна
var wList = mdm.System.getWindowList();
var i = 0;
while (wList[i][1]) {
        if (wList[i][0] == formTitle || wList[i][0] == appTitle) {
                hwnd = wList[i][1];
        }
        i++;
}
myDLL = new mdm.DLL("user32.dll");
SetKey();
// параметр 0x003e  выбран произвольно, но он должени быть в
// пределах от 0x0000 до 0xBFFF, и имеет смысл уникального id
// для комбинации клавиш.
// 1 - это MOD_ALT константа
// 9 - это VK_TAB константа

function SetKey() {
        // описание вызываемой функции.
        //BOOL RegisterHotKey(
                            //HWND hWnd,        // window to receive hot-key notification
                                //int id,        // identifier of hot key
                                //UINT fsModifiers,        // key-modifier flags
                                //UINT vk        // virtual-key code
  //)

        myDLL.addParameter("integer", hwnd);
        myDLL.addParameter("integer", 0x003e);
        myDLL.addParameter("integer", 1);
        myDLL.addParameter("integer", 9);
        mdm.prompt(myDLL.call("boolean", "RegisterHotKey"));
        // промт конечно можно убрать: myDLL.call("boolean", "RegisterHotKey")
        myDLL.clear();
}
function UnSet() {
        // здесь возвращаем все на круги своя
        // описание вызываемой функции.
        //BOOL UnregisterHotKey(
                                    //HWND hWnd,        // window associated with hot key
                                    //int id        // identifier of hot key
  //);

        myDLL.addParameter("integer", hwnd);
        myDLL.addParameter("integer", 0x003e);
        mdm.prompt(myDLL.call("boolean", "UnregisterHotKey"));
        myDLL.clear();
}


Agon 15.01.2008 14:33

Цитата:

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

Цитата:

а вот и пример, все проще оказалось
спасибо, пример красивый
жаль у меня не работает :) (XP sp2)
возвращает false.

Интересно, как этот код будет себя вести под Вистой?

Еще я вспомнил, что придется отключать Ctrl+Esc и клавишу "window" или как она там называется (MOD_WIN = 8 вроде)

Хорошо, если бы все-таки удалось это сделать, есть еще одна проблема: появляется flash-меню при нажатии клавиши "Меню" (VK_MENU), trapallkeys не помогает (приходится убирать из ресурсов exe-заголовка, но это геромой)

alexcon314 15.01.2008 15:10

>>жаль у меня не работает (XP sp2) возвращает false.
возможно нужно поменять параметр вызова, тот который у меня в примере '0x003e'. вообще, может быть конфликт при "случайном" совпадении id комбинаций клавиш. попробуйте поменять его в указанных пределах. у меня сразу заработало. XP SP2. покопайте API - встречал там метод как этот id получать программно и без конфликтов. GlobalAddAtom вроде. под вистой щас проверю :)
а вот с появлением флаш-меню по кнопке "Меню" вы меня удивили. никогда раньше не задумывался над этим. а меж тем весьма актуально..
просто интересно (надеюсь не дадут нам по плюсу) как вы заглядываете в ехе цинковский?
...
под вистой не катит. дожимать не стал.
и тем не менее остается вариант с хуком.

Agon 15.01.2008 16:02

у меня была версия 2.5.0.6, видимо из-за этого.
На последней (34) работает.

Под висту, видимо, cтоит экспериментировать с выходом zinc 3.0,
там обещана нормальная поддержка висты
(сейчас на некоторых машинах с вистой вообще цинк не запускается)
Придется ждать, все равно продажи 2.5 приостановлены...

Цитата:

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

alexcon314 15.01.2008 16:51

вот такой вариант. срабатывает аж при нуле.но на висте хоть и выходит из цикла, типа true все-таки возвращает, но не катит все равно :(
Код:

// задействуем обработчик события onAppExit чтобы при выходе "восстановить" скорость  мыши.
mdm.Application.enableExitHandler();
mdm.Application.onAppExit = function() {
        UnSet(p);
        myDLL.close();
        mdm.Application.exit();
};
// принудительно ставим заголовок формы и приложения в таскбаре,
// чтобы по ним найти хэндл
formTitle = mdm.Forms.MainForm.title = "form";
appTitle = mdm.Application.title = "app";
// получаем хэндл окна
var wList = mdm.System.getWindowList();
var i = 0;
while (wList[i][1]) {
        if (wList[i][0] == formTitle || wList[i][0] == appTitle) {
                hwnd = wList[i][1];
        }
        i++;
}
myDLL = new mdm.DLL("user32.dll");
//SetKey();
// параметр 0x003e  выбран произвольно, но он должени быть в
// пределах от 0x0000 до 0xBFFF, и имеет смысл уникального id
// для комбинации клавиш.
// 1 - это MOD_ALT константа
// 9 - это VK_TAB константа
p = 0;
while (!SetKey(p) && p <= 49151) {
        SetKey(p);
        p++;
}
mdm.prompt(p);
function SetKey(p) {
        // описание вызываемой функции.
        //BOOL RegisterHotKey(
        //HWND hWnd,        // window to receive hot-key notification
        //int id,        // identifier of hot key
        //UINT fsModifiers,        // key-modifier flags
        //UINT vk        // virtual-key code
        //)
        myDLL.addParameter("integer", hwnd);
        myDLL.addParameter("integer", p);
        myDLL.addParameter("integer", 1);
        myDLL.addParameter("integer", 9);
        //mdm.prompt(myDLL.call("boolean", "RegisterHotKey"));
        var res = myDLL.call("boolean", "RegisterHotKey");
        myDLL.clear();
        return res;
}
function UnSet(p) {
        // здесь возвращаем все на круги своя
        // описание вызываемой функции.
        //BOOL UnregisterHotKey(
        //HWND hWnd,        // window associated with hot key
        //int id        // identifier of hot key
        //);
        myDLL.addParameter("integer", hwnd);
        myDLL.addParameter("integer", p);
        mdm.prompt(myDLL.call("boolean", "UnregisterHotKey"));
        myDLL.clear();
}

да, подождем 3.0. за прогу спасибо.

alexcon314 16.01.2008 16:04

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

Agon 21.01.2008 22:11

zinc 3.0
mdm.Application.Kiosk.disableAltEsc();
mdm.Application.Kiosk.disableAltTab();
mdm.Application.Kiosk.disableAltF4();
mdm.Application.Kiosk.disableAppKey(); //Disables the Menu key.
mdm.Application.Kiosk.disableCtrlEsc();
mdm.Application.Kiosk.disableWindowsDesktop();
mdm.Application.Kiosk.disableWindowsStartButton();
mdm.Application.Kiosk.disableWindowsTaskbar();
mdm.Application.Kiosk.disableWinKey();
:)

alexcon314 22.01.2008 07:06

ух ты, круто.

iNils 22.01.2008 07:31

Скачал бету. Появилась поддержка линукса! А вот поддержку tcp сокетов так и не включили :(

alexcon314 22.01.2008 10:28

ммм...iNils, Agon не поделитесь? я не могу скачать с офф сайта

iNils 22.01.2008 10:44

Эээ... бету дают в разделе апдейт, то есть только по лицензии. По этому сорри.:)
Я так понял, что 31 января будет релиз, и возможно сразу триал выпустят.

alexcon314 22.01.2008 11:20

понимаю :). подождем.


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

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