Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.15.221.67] |
|
Сообщ.
#1
,
|
|||
|
Здравствуйте! Помогите зарегистрировать комбинацию клавишь или одну горячую клавишу. Программа записывает в реестр комбинацию клавишь или одну горячую клавишу (в зависимости от выбора юзера) в виде DWORD-параметра. Позже считывает и заносит в переменную wHotKey. Вопрос, как теперь зарегистрировать с помощью функции RegisterHotKey комбинацию клавишь или одну горячую клавишу? Я думал MAKEWORD мне поможет, но не вышло:
Помогите!!! |
Сообщ.
#2
,
|
|
|
Ты хочешь обратиться к младшему или станшему слову? Тогда LongRec
|
Сообщ.
#3
,
|
|
|
И к тому и к другом!
|
Сообщ.
#4
,
|
|||||
|
Дело в том, что wHotKey занимает два байта, то есть WORD. Я так понял, что тебе надо записать в реестре все в одном ключе DWORD (4 байта). Функция MAKEWORD делает "склеивает" два байта, а тебе надо юзать функцию, которая "склеивает" два слова. |
Сообщ.
#5
,
|
|
|
можна и так:
RegisterHotkey(Handle,1,MOD_CONTROL or MOD_SHIFT,ord('A')); т.е. ловим Ctrl+Shift+A |
Сообщ.
#6
,
|
|
|
Используй MapVirtualKey()
|
Сообщ.
#7
,
|
|||
|
Показываю CODE:
А результата-та и нет! Помогите МАСТЕРА!!! |
Сообщ.
#8
,
|
|
|
ShortCutToText - это не то - вот смотри:
function ShortCutToText(ShortCut: TShortCut): string; Description Call ShortCutToText to obtain a text description of the shortcut associated with a menu item. Use this function when the application needs to display a description of a shortcut to the user. |
Сообщ.
#9
,
|
|
|
Да дело совсем не в ShortCutToText. Это я для себя сделал, чтобы видеть, есть ли что-нибудь в переменной Modifiers. А эта переменная пустая. Хот-Кей не регистрируется.
|
Сообщ.
#10
,
|
|
|
Думаю дело как раз в этом - просто ShortCutToText не покажет тебе есть ли что-то в Modifiers или нет, да и при чем тут вообще Modifiers???
Смотри справку по RegisterHotKey: Return Values If the function succeeds, the return value is nonzero. If the function fails, the return value is zero. |
Сообщ.
#11
,
|
|||
|
Ну, мне ж нужно знать, какое сочетание клавиш (CTRL и т.д.) установил пользователь. |
Сообщ.
#12
,
|
|||||
|
2 _8989
Проверь значение которое возвращает RegisterHotKey, если это FALSE, то либо данное сочетание уже используется, либо задано неверно, что скорее всего. ИМХО добавь обнуление переменной Modifiers перед тем как забивать туда значения флагов. Проверь совпадает ли значение WordRec(wHotKey).Lo с тем которое должно быть.... если нет то копайся с SendMessage - оно тебе что-то не то возвращает. ЗЫ
Это нормально, т.к. если в ShortCutToText передать параметр в котором нет самой горячей клавиши, только флаги ALT, CTRL и SHIFT, то функция вернет пустую строку (смотри исходник). |
Сообщ.
#13
,
|
|||
|
Всё нормально! RegisterHotKey возвращает TRUE. C WordRec(wHotKey).Lo всё нормально, буква распознаеться, не распознаеться Modifiers. Помогите!!!
|
Сообщ.
#14
,
|
|
|
_8989 - читай внимательно справку
The HKM_GETHOTKEY message retrieves the virtual-key code and modifier flags of a hot key from a hot-key control. HKM_GETHOTKEY wParam = 0; lParam = 0; Return Values Returns the virtual-key code and modifier flags. The virtual-key code is in the low-order byte, and the modifier flags are in the high-order byte. The modifier flags can be a combination of the following values: Value Meaning HOTKEYF_ALT ALT key HOTKEYF_CONTROL CTRL key HOTKEYF_EXT Extended key HOTKEYF_SHIFT SHIFT key так шо надо Low и High пользовать... |
Сообщ.
#15
,
|
|||
|
Спасибо!
Это работет, но распознаёться только HOTKEYF_CONTROL, т.к. он последний. Как исправить ситуацию? |
Сообщ.
#16
,
|
|
|
так это не будет работать т.к. для RegisterHotKey надо использовать MOD_ALT, MOD_CONTROL, MOD_SHIFT, а не HOTKEYF_ALT, HOTKEYF_CONTROL, HOTKEYF_SHIFT - у них и значения разные (т.е. MOD_CONTROL=4, а HOTKEYF_CONTROL=$02)
|
Сообщ.
#17
,
|
|
|
ИМХО, надо первым параметром передавать хэндл окна, на которое клеится хоткей Как оно вообще работает - удивляюсь 0 не катит, я писал в одной своей проге Form1.Handle - и все пахало, а вот как расшифровывал модифер - не скажу, т.к. исходники навернулись...
|
Сообщ.
#18
,
|
|||||
|
Ну почему же, если в качестве дескриптора окна передаётся 0, то сообщение будет ассоциировано с данным потоком и ловить его нужно в цикле обработки сообщений. 2 _8989 пиши примерно следующее
|
Сообщ.
#19
,
|
|
|
В общем, я нашел код для этого. Реально рабочий. Только там нужОн VCL. Ставим HK: THotKey и во время загрузки проги загружаем в нее в текстовом виде хоткей:
HK.HotKey:=TextToShortCut(Inif.ReadString('Main', 'Hotkey', '')); Ну, у меня из INI читается, но суть та же самая. Потом: modif:=0; if (hkCtrl in HK.Modifiers) then modif:=modif+MOD_CONTROL; if (hkAlt in HK.Modifiers) then modif:=modif+MOD_ALT; if (hkShift in HK.Modifiers) then modif:=modif+MOD_SHIFT; ShortCutToKey(HK.HotKey, K, SS); Итак, у нас в modif - модификаторы, а в K - вирт. код клавиши, SS нас не интересует, хотя можно прямо из него тянуть модификаторы (у меня из компонента). Теперь: RegisterHotKey(Form1.Handle, $8760, Modif, k); Опять же, номер клавиши из рабочей проги. Меня немного смущает двойное преобразование из текста в ShortCut и из него - в VK и модификатор, возможно, можно и проще. Но мне в проге нужен был сам компонент THotKey... |
Сообщ.
#20
,
|
|
|
ВСЕМ огромное спасибо за помощь! Особенную благодарность хочу выразить rhf. Еще раз - Сенкс!
|
Сообщ.
#21
,
|
|
|
2_8989
Так подними ему рейтинг-то, раз тебе помогли его ответы. |
Сообщ.
#22
,
|
|
|
Как?
|
Сообщ.
#23
,
|
|
|
А.. ну ты же гость. Сначала зарегится как минимум надо.
|
Сообщ.
#24
,
|
|
|
как делавл я
[code] ....................... Procedure Hot(var Message:TMessage);message WM_HOTKEY; .......... RegisterHotKey(Wnd.Handle,0,0,VK_TAB); ............... Procedure Twnd1.Hot; Begin .............. end; |