Автор | Сообщение |
|
| постоянный участник
|
Пост N: 14
Зарегистрирован: 29.05.06
|
|
Отправлено: 11.10.07 10:02. Заголовок: Неприятная особенность обработки горячих клавиш
Всем привет. Решил написать на MiniGui/Harbour небольшую программу. В общем, впечатления очень неплохие. Но вот с какой неприятным моментом столкнулся. На одной из форм я объявляю через _DefineHotKey() горячую клавишу, конкретно пробел, по нажатию которой оператор сможет вызывать некоторый справочник. В программе все отрабатывает штатно. НО. Клавиша пробел как-бы блокируется ВО ВСЕХ ОСТАЛЬНЫХ работающих приложениях. Пробовал объявить горячей клавишей вместо пробела что-то другое - исход тот-же, горячая клавиша блокируется. Очень возможно, что я что-то неправильно сделал, хотя судя по исходникам примеров, я поступил с объявлением горячей клавиши достаточно стандартно. Никто не подскажет, как можно отловить событие клавиатурного ввода на форме ?
|
|
|
Ответов - 10
[только новые]
|
|
|
| модератор
|
Пост N: 588
Зарегистрирован: 25.05.05
|
|
Отправлено: 11.10.07 12:52. Заголовок: Re:
G-Serge пишет: цитата: | Клавиша пробел как-бы блокируется ВО ВСЕХ ОСТАЛЬНЫХ работающих приложениях. |
| Видимо, речь идет о Клиппер-программах? Если да, то я подтверждаю эту проблему с "горячими" клавишами и ДОС-задачами. По отношению к GUI-приложениям такой проблемы НЕ существует! Есть стимул переводить ВСЕ задачи на рельсы GUI
|
|
|
|
| постоянный участник
|
Пост N: 15
Зарегистрирован: 29.05.06
|
|
Отправлено: 11.10.07 13:15. Заголовок: Re:
да нет, не клиппер. но вроде нашел закономерность. у меня горячая клавиша определяется при получении фокуса одним из 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("!!!")} ) ; ... то в этом случае никаких проблем...
|
|
|
|
| модератор
|
Пост N: 589
Зарегистрирован: 25.05.05
|
|
Отправлено: 11.10.07 15:45. Заголовок: Re:
G-Serge пишет: цитата: | ON LOSTFOCUS _DefineHotKey ( "TovarToComplectAddEditForm" , 0 , VK_SPACE ) ; ... И в этом случае проблема и возникает. |
| Теперь понятно! Такое определение НЕ освобождает горячую клавишу, a блокирует ее
|
|
|
|
| постоянный участник
|
Пост N: 16
Зарегистрирован: 29.05.06
|
|
Отправлено: 11.10.07 16:07. Заголовок: Re:
Спасибо, понял в чем неправ :)
|
|
|
|
| постоянный участник
|
Пост N: 17
Зарегистрирован: 29.05.06
|
|
Отправлено: 11.10.07 16:14. Заголовок: Re:
И еще тогда вопрос знатокам, пока тема не остыла :) Как можно отлавливать клавиатурные события на форме, не прибегая к определению горячих клавиш ? Есть ли что-то вроде inkey() для формы ?
|
|
|
|
| модератор
|
Пост N: 590
Зарегистрирован: 25.05.05
|
|
Отправлено: 11.10.07 16:17. Заголовок: Re:
G-Serge пишет: цитата: | Как можно отлавливать клавиатурные события на форме, не прибегая к определению горячих клавиш ? |
| Никак Только используя горячие клавиши G-Serge пишет: цитата: | Есть ли что-то вроде inkey() для формы ? |
| Не-а...
|
|
|
|
| постоянный участник
|
Пост N: 18
Зарегистрирован: 29.05.06
|
|
Отправлено: 11.10.07 17:40. Заголовок: Re:
Досаааааадно
|
|
|
|
| постоянный участник
|
Пост N: 265
Зарегистрирован: 09.10.06
|
|
Отправлено: 11.10.07 21:17. Заголовок: Re:
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() )
|
|
|
|
| постоянный участник
|
Пост N: 19
Зарегистрирован: 29.05.06
|
|
Отправлено: 12.10.07 09:31. Заголовок: Re:
Вот это уже ближе к тому, что ищу. Попробую применить. Петр, спасибо за подсказанное направление.
|
|
|
|
| постоянный участник
|
Пост N: 20
Зарегистрирован: 29.05.06
|
|
Отправлено: 12.10.07 11:27. Заголовок: Re:
Попробовал. Клавиатурные события до "переопределенного" обработчика не доходят. Убедился в этом, сделав вывод кодов всех поступающих в обработчик сообщений в текстовый файл. Ну чтож, придется на все клавиши обоих раскладок горячие клавиши ставить :) Хорошо, только в одном месте такое требуется. А вообще - MiniGui/Harbour В ЦЕЛОМ очень приятная вещь, действительно, унаследовавшая от Clipper его простоту, понятность и в то же время огромные возможности для расширения благодаря открытости.
|
|
|
|