Форум » GUI » Неприятная особенность обработки горячих клавиш » Ответить

Неприятная особенность обработки горячих клавиш

G-Serge: Всем привет. Решил написать на MiniGui/Harbour небольшую программу. В общем, впечатления очень неплохие. Но вот с какой неприятным моментом столкнулся. На одной из форм я объявляю через _DefineHotKey() горячую клавишу, конкретно пробел, по нажатию которой оператор сможет вызывать некоторый справочник. В программе все отрабатывает штатно. НО. Клавиша пробел как-бы блокируется ВО ВСЕХ ОСТАЛЬНЫХ работающих приложениях. Пробовал объявить горячей клавишей вместо пробела что-то другое - исход тот-же, горячая клавиша блокируется. Очень возможно, что я что-то неправильно сделал, хотя судя по исходникам примеров, я поступил с объявлением горячей клавиши достаточно стандартно. Никто не подскажет, как можно отловить событие клавиатурного ввода на форме ?

Ответов - 10

gfilatov: G-Serge пишет: Клавиша пробел как-бы блокируется ВО ВСЕХ ОСТАЛЬНЫХ работающих приложениях. Видимо, речь идет о Клиппер-программах? Если да, то я подтверждаю эту проблему с "горячими" клавишами и ДОС-задачами. По отношению к GUI-приложениям такой проблемы НЕ существует! Есть стимул переводить ВСЕ задачи на рельсы GUI

G-Serge: да нет, не клиппер. но вроде нашел закономерность. у меня горячая клавиша определяется при получении фокуса одним из GETBOX и при потере фокуса переопределяется, как горячая она больше не нужна: ... ON GOTFOCUS _DefineHotKey ( "TovarToComplectAddEditForm" , 0 , VK_SPACE , {|| msgbox("!!!")} ) ; ON LOSTFOCUS _DefineHotKey ( "TovarToComplectAddEditForm" , 0 , VK_SPACE ) ; ... И в этом случае проблема и возникает. А вот если определить горячую клавишу ОДИН РАЗ, в любом месте после создания формы ... _DefineHotKey ( "TovarToComplectAddEditForm" , 0 , VK_SPACE , {|| msgbox("!!!")} ) ... или в том-же GETBOX не отрабатывать переопределение по LOSTFOCUS ... ON GOTFOCUS _DefineHotKey ( "TovarToComplectAddEditForm" , 0 , VK_SPACE , {|| msgbox("!!!")} ) ; ... то в этом случае никаких проблем...

gfilatov: G-Serge пишет: ON LOSTFOCUS _DefineHotKey ( "TovarToComplectAddEditForm" , 0 , VK_SPACE ) ; ... И в этом случае проблема и возникает. Теперь понятно! Такое определение НЕ освобождает горячую клавишу, a блокирует ее


G-Serge: Спасибо, понял в чем неправ :)

G-Serge: И еще тогда вопрос знатокам, пока тема не остыла :) Как можно отлавливать клавиатурные события на форме, не прибегая к определению горячих клавиш ? Есть ли что-то вроде inkey() для формы ?

gfilatov: G-Serge пишет: Как можно отлавливать клавиатурные события на форме, не прибегая к определению горячих клавиш ? Никак Только используя горячие клавиши G-Serge пишет: Есть ли что-то вроде inkey() для формы ? Не-а...

G-Serge: Досаааааадно

Петр: G-Serge пишет: Как можно отлавливать клавиатурные события на форме, не прибегая к определению горячих клавиш ? Есть ли что-то вроде inkey() для формы ? Просто нужно обрабатывать сл.события SET EVENTS FUNCTION TO MYEVENTS .. FUNCTION MyEvents ( hWnd, nMsg, wParam, lParam ) LOCAL result := 0 SWITCH nMsg CASE WM_KEYDOWN ..делаем что-то EXIT CASE WM_KEYUP .. CASE WM_SYSKEYDOWN .. CASE WM_SYSKEYUP .. CASE WM_CHAR .. CASE WM_SYSCHAR .. CASE WM_SETHOTKEY #ifdef __XHARBOUR__ DEFAULT #else OTHERWISE #endif result := Events( hWnd, nMsg, wParam, lParam ) END RETURN result Для WM_KEYDOWN (KEYUP) nVirtKey = (int) wParam; // virtual-key code lKeyData = lParam; // key data Parameters nVirtKey Value of wParam. Specifies the virtual-key code of the nonsystem key. lKeyData Value of lParam. Specifies the repeat count, scan code, extended-key flag, context code, previous key-state flag, and transition-state flag, as shown in the following table: Value Description 0-15 Specifies the repeat count. The value is the number of times the keystroke is repeated as a result of the user holding down the key. 16-23 Specifies the scan code. The value depends on the original equipment manufacturer (OEM). 24 Specifies whether the key is an extended key, such as the right-hand ALT and CTRL keys that appear on an enhanced 101- or 102-key keyboard. The value is 1 if it is an extended key; otherwise, it is 0. 25-28 Reserved; do not use. 29 Specifies the context code. The value is always 0 for a WM_KEYDOWN message. 30 Specifies the previous key state. The value is 1 if the key is down before the message is sent, or it is 0 if the key is up. 31 Specifies the transition state. The value is always 0 for a WM_KEYDOWN message. Для обработки lParam можно использовать HB_BitTest() ( HB_BitIsSet() )

G-Serge: Вот это уже ближе к тому, что ищу. Попробую применить. Петр, спасибо за подсказанное направление.

G-Serge: Попробовал. Клавиатурные события до "переопределенного" обработчика не доходят. Убедился в этом, сделав вывод кодов всех поступающих в обработчик сообщений в текстовый файл. Ну чтож, придется на все клавиши обоих раскладок горячие клавиши ставить :) Хорошо, только в одном месте такое требуется. А вообще - MiniGui/Harbour В ЦЕЛОМ очень приятная вещь, действительно, унаследовавшая от Clipper его простоту, понятность и в то же время огромные возможности для расширения благодаря открытости.



полная версия страницы