![]() |
|
||||||||||
|
|||||
|
Регистрация: Mar 2002
Сообщений: 43
|
Нужно убрать Alt-Tab в полноэкранном приложении.
Сделал через mdm.Application.onAppChangeFocus но получается не эстетично: появляется окно выбора приложения, при выборе любого приложения, остается текущее, но иногда выскакивает меню "Пуск" и экран дергается т.к. разрешение не системное. Прочитал здесь насчет перехвата событий через dll, может этим путем пойти? Хочу, чтобы ничего не появлялось, экран не мигал и т.д. |
|
|||||
|
listener
|
>>Прочитал здесь насчет перехвата событий через 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
);
Цитата:
SystemParametersInfo(97, 0, 0, 0); ... ха-ха. под XP не катит. тогда хук ставить. про хуки см статью в ссылках по ZInc "слушаем систему". примерчик может изготовлю по-позже, но сейчас некогда. Последний раз редактировалось alexcon314; 14.01.2008 в 11:33. |
|
|||||
|
listener
|
а вот и пример, все проще оказалось
// отключаем 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();
}
Последний раз редактировалось alexcon314; 15.01.2008 в 12:47. |
|
|||||
|
Регистрация: Mar 2002
Сообщений: 43
|
Цитата:
(я им пользуюсь когда он еще был Flash Studio Pro), после перехода на другую задачу по альттаб, а потом обратно, не восстанавливается несистемное разрешение моего приложения. Точнее разрешение теряется (обратно к системному) при переходе на другую задачу. Приложение становится не полноэкранным, выглядит это как баг. Раньше задача сменялась, а разрешение сохранялось. Цитата:
жаль у меня не работает (XP sp2)возвращает false. Интересно, как этот код будет себя вести под Вистой? Еще я вспомнил, что придется отключать Ctrl+Esc и клавишу "window" или как она там называется (MOD_WIN = 8 вроде) Хорошо, если бы все-таки удалось это сделать, есть еще одна проблема: появляется flash-меню при нажатии клавиши "Меню" (VK_MENU), trapallkeys не помогает (приходится убирать из ресурсов exe-заголовка, но это геромой) |
|
|||||
|
listener
|
>>жаль у меня не работает (XP sp2) возвращает false.
возможно нужно поменять параметр вызова, тот который у меня в примере '0x003e'. вообще, может быть конфликт при "случайном" совпадении id комбинаций клавиш. попробуйте поменять его в указанных пределах. у меня сразу заработало. XP SP2. покопайте API - встречал там метод как этот id получать программно и без конфликтов. GlobalAddAtom вроде. под вистой щас проверю ![]() а вот с появлением флаш-меню по кнопке "Меню" вы меня удивили. никогда раньше не задумывался над этим. а меж тем весьма актуально.. просто интересно (надеюсь не дадут нам по плюсу) как вы заглядываете в ехе цинковский? ... под вистой не катит. дожимать не стал. и тем не менее остается вариант с хуком. Последний раз редактировалось alexcon314; 15.01.2008 в 15:15. |
|
|||||
|
Регистрация: Mar 2002
Сообщений: 43
|
у меня была версия 2.5.0.6, видимо из-за этого.
На последней (34) работает. Под висту, видимо, cтоит экспериментировать с выходом zinc 3.0, там обещана нормальная поддержка висты (сейчас на некоторых машинах с вистой вообще цинк не запускается) Придется ждать, все равно продажи 2.5 приостановлены... Цитата:
использую exescope, но можно любой прогой. |
|
|||||
|
listener
|
вот такой вариант. срабатывает аж при нуле.но на висте хоть и выходит из цикла, типа 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();
}
Последний раз редактировалось alexcon314; 15.01.2008 в 16:55. |
|
|||||
|
listener
|
я на счет кнопки "Меню"...
Вобщем-то проблема появления флаш-меню по этой кнопке решается через самописную длл. я правда использовал не хук, а подмену оконной процедуры. но работает, отключается оно, меню это... можно и другие клавиши ловить, да и мыш ловится. но до конца этот вопрос я не прорабатывал. добавлю только, что нужное окно в цинке запрятано аж до второго "ребенка". чтобы имя класса окна получить приходится юзать программы типа WinSpector. Последний раз редактировалось alexcon314; 16.01.2008 в 16:16. |
|
|||||
|
Регистрация: Mar 2002
Сообщений: 43
|
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(); ![]() |
![]() |
![]() |
Часовой пояс GMT +4, время: 22:22. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|