IPB
ЛогинПароль:

> 

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Контрол Hot Key
сообщение
Сообщение #1


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

Репутация: -  11  +


Возникли проблемы. Ситуация такова: при создании главного окна я связываю с ним комбинацию горячих клавиш (RegisterHotKey), с которой ассоциирую идентификатор HotKeyTId. Но позже, я предоставляю юзеру возможность, в случае необходимости, изменить комбинацию, использую Hot Key контрол, создаваемого на отдельном PopUp окне. Когда ввод Hot Keys закончен, пользователю необходимо подтвердить его нажатием на кнопку (еще один контрол окна PopUp), после чего оконная функция PopUp'a считывает ввод Hot Key контрола, посылая ему сообщение HKM_GETHOTKEY. В ответ я получаю слово (Word), в котором хранятся флаги специальных клавиш (HiWord(word)), а также код виртуальной клавиши (LoWord(Word)), введенных юзером. Это слово я посылаю главному окну, которое, в свою очередь, снимает предыдущею комбинацию горячих клавиш с HotKeyTId (UnregisterHotKey ) и ставит новую, считанную с контрола. Проблема в том, что HiWord(word)) всегда возвращает 0... Из-за чего у меня возникает сомнение что HKM_GETHOTKEY сообщения корректно, в моем случае, и что вместо строки с Hot Key контрола оно возвращает комбинацию горячих клавиш, при которых этот контрол будет активен. Так ли это?

Сообщение отредактировано: Bokul -


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

Репутация: -  11  +


В принципе я разобрался, но из-за неопытности с работой над числами логическими операциями переспрошу.

{ HKM_GETHOTKEY message }
HOTKEYF_ALT = 4;
HOTKEYF_CONTROL = 2;
HOTKEYF_EXT = 8;
HOTKEYF_SHIFT = 1;


Такие значения позволяют контролировать значение определенного бита в байте.
1=2^0-младший бит
2=2^1
4=2^2
8=2^3 - старший бит
А так как не надо больше чем указать использовалась ли данная клавиша или нет, одного байта хватает с головой для кодирования четырех.

if (hi(buf) and HOTKEYF_ALT) = HOTKEYF_ALT then modif := modif or MOD_ALT;
if (hi(buf) and HOTKEYF_CONTROL) = HOTKEYF_CONTROL then modif := modif or MOD_CONTROL;
if (hi(buf) and HOTKEYF_SHIFT) = HOTKEYF_SHIFT then modif := modif or MOD_SHIFT;
if (hi(buf) and HOTKEYF_EXT) = HOTKEYF_EXT then modif := modif or MOD_WIN;


Тут мы переворачиваем, как ты сказал, так как байт специальных клавиш (hi(buf)) упакован, используя другие константы для клавиш. Разберем один из этих переворотов:
if (hi(buf) and HOTKEYF_ALT) = HOTKEYF_ALT then modif := modif or MOD_ALT;

Допустим, что hi(buf)=1101 тогда при выполнении логического "и" с HOTKEYF_ALT=0100, над каждой парой битов произойдет эта операция, а в случае совпадения третьей - результат будет тем самым HOTKEYF_ALT, так как другие нули (false) и вернуть также нули. И-так, если результат операции совпал со значением HOTKEYF_ALT добавляем необходимый бит в байт операцией
modif or MOD_ALT


Ну и последние
buf := (modif shl 8) or (buf and $00FF);

Так как buf это слово, но высший байт которого заполнен неправильно, надо обнулить его buf and $00FF и записать туда нормальное значение modif, предварительно сделав его высшим байтом слова, сдвигом на 8 бит (один байт) (modif shl 8). Все. Так?

PS а откуда узнал что есть разные константы кодирующие одно и то же.

Сообщение отредактировано: Bokul -


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Bokul   Контрол Hot Key   25.07.2007 1:24
Bokul   В случае необходимости могу предоставит код...   25.07.2007 1:49
Bokul   Если не брать во внимание PopUp окно, а заменить …   25.07.2007 5:03
volvo   А что ты ожидал, что к тебе вернется, при таком оп…   25.07.2007 5:04
Bokul   Я выразился не правильно, на самом деле я читаю вс…   25.07.2007 5:07
volvo   Кстати, проблема у тебя может быть еще в том, что …   25.07.2007 5:08
Bokul   Спасибо, действительно ошибка, но после исправлени…   25.07.2007 5:11
volvo   Так... Моя ошибка - надо все-таки работать при Buf…   25.07.2007 5:34
Bokul   Премного благодарен! :good:   25.07.2007 5:40
Bokul   Потестил... рабочии комбинации только Сtrl'a +…   25.07.2007 6:25
volvo   Проблема в следующем: описаны константы вот так …   25.07.2007 12:26
volvo   Так, ну все понятно... Какой-то умник решил, что в…   25.07.2007 12:50
Bokul   В принципе я разобрался, но из-за неопытности с ра…   25.07.2007 22:43
volvo   :yes2: Посмотрел здесь: HKM_GETHOTKEY Message, …   25.07.2007 22:55
Bokul   Бессмысленный смысл путаницы стал ясен: этим разра…   26.07.2007 9:17
volvo   А зачем? Для экономии места, что-ли? :) Теоретиче…   26.07.2007 12:16
Bokul   Ради этого и спросил.. :) А будит ли так? Теоре…   26.07.2007 22:10
volvo   Практически? Не уверен, что делать вот так: var mo…   26.07.2007 23:03


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 3.05.2024 20:20
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name