On-line: гостей 0. Всего: 0 [подробнее..]
АвторСообщение
постоянный участник


Пост N: 14
Зарегистрирован: 29.05.06
ссылка на сообщение  Отправлено: 11.10.07 10:02. Заголовок: Неприятная особенность обработки горячих клавиш


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


Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 10 [только новые]


модератор




Пост N: 588
Зарегистрирован: 25.05.05
ссылка на сообщение  Отправлено: 11.10.07 12:52. Заголовок: Re:


G-Serge пишет:

 цитата:
Клавиша пробел как-бы блокируется ВО ВСЕХ ОСТАЛЬНЫХ работающих приложениях.


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

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост 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("!!!")} ) ;
...

то в этом случае никаких проблем...


Спасибо: 0 
ПрофильЦитата Ответить
модератор




Пост N: 589
Зарегистрирован: 25.05.05
ссылка на сообщение  Отправлено: 11.10.07 15:45. Заголовок: Re:


G-Serge пишет:

 цитата:
ON LOSTFOCUS _DefineHotKey ( "TovarToComplectAddEditForm" , 0 , VK_SPACE ) ;
...
И в этом случае проблема и возникает.


Теперь понятно!
Такое определение НЕ освобождает горячую клавишу, a блокирует ее

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 16
Зарегистрирован: 29.05.06
ссылка на сообщение  Отправлено: 11.10.07 16:07. Заголовок: Re:


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


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 17
Зарегистрирован: 29.05.06
ссылка на сообщение  Отправлено: 11.10.07 16:14. Заголовок: Re:


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


Спасибо: 0 
ПрофильЦитата Ответить
модератор




Пост N: 590
Зарегистрирован: 25.05.05
ссылка на сообщение  Отправлено: 11.10.07 16:17. Заголовок: Re:


G-Serge пишет:

 цитата:
Как можно отлавливать клавиатурные события на форме, не прибегая к определению горячих клавиш ?


Никак Только используя горячие клавиши

G-Serge пишет:

 цитата:
Есть ли что-то вроде inkey() для формы ?


Не-а...



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 18
Зарегистрирован: 29.05.06
ссылка на сообщение  Отправлено: 11.10.07 17:40. Заголовок: Re:


Досаааааадно

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост 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() )


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 19
Зарегистрирован: 29.05.06
ссылка на сообщение  Отправлено: 12.10.07 09:31. Заголовок: Re:


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

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 20
Зарегистрирован: 29.05.06
ссылка на сообщение  Отправлено: 12.10.07 11:27. Заголовок: Re:


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

Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 130
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет