На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! user posted image
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Соблюдайте общие правила форума

Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как запустить программу/файл? (и дождаться ее завершения)
5. Как перехватить API-функции, поставить hook? (перехват сообщений от мыши, клавиатуры - внедрение в удаленное адресное прстранство)
... (продолжение следует) ...

Внимание:
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки - бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Rouse_, user posted image Krid

Модераторы: Rouse_, Krid
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> RegisterHotKey
    Здравствуйте!

    Помогите зарегистрировать комбинацию клавишь или одну горячую клавишу.

    Программа записывает в реестр комбинацию клавишь или одну горячую клавишу (в зависимости от выбора юзера) в виде DWORD-параметра. Позже считывает и заносит в переменную wHotKey. Вопрос, как теперь зарегистрировать с помощью функции RegisterHotKey комбинацию клавишь или одну горячую клавишу? Я думал MAKEWORD мне поможет, но не вышло:

    CODE
    RegisterHotKey(0, ID_HOTKEY, MAKEWORD(0, wHotKey), MAKEWORD(wHotKey, 0));


    Помогите!!!
      Ты хочешь обратиться к младшему или станшему слову? Тогда LongRec
        И к тому и к другом!
          CODE
          RegisterHotKey(0, ID_HOTKEY, MAKEWORD(0, wHotKey), MAKEWORD(wHotKey, 0));

          CODE

          WORD MAKEWORD(
          BYTE bLow,
          BYTE bHigh
          );

          Дело в том, что wHotKey занимает два байта, то есть WORD. Я так понял, что тебе надо записать в реестре все в одном ключе DWORD (4 байта). Функция MAKEWORD делает "склеивает" два байта, а тебе надо юзать функцию, которая "склеивает" два слова.
          Сообщение отредактировано: Vex -
            можна и так:
            RegisterHotkey(Handle,1,MOD_CONTROL or MOD_SHIFT,ord('A'));
            т.е. ловим Ctrl+Shift+A
              Используй MapVirtualKey()
                Показываю CODE:

                CODE
                var
                wHotKey: Word
                Modifiers: cardinal = 0;

                begin
                //Считываю значение из компонента msctls_hotkey32 (ID - 303)
                wHotKey := SendMessage(GetDlgItem(hwnd, 303), HKM_GETHOTKEY, 0, 0);

                if (wHotKey and scShift) <> 0 then Modifiers := Modifiers or MOD_SHIFT;
                if (wHotKey and scAlt) <> 0 then Modifiers := Modifiers or MOD_ALT;
                if (wHotKey and scCtrl ) <> 0 then Modifiers := Modifiers or MOD_CONTROL;

                //Пытаюсь зарегистрировать
                RegisterHotKey(0, ID_HOTKEY1, Modifiers, WordRec(wHotKey).Lo);

                //Вывожу результат
                MessageBox(hwnd,PChar(ShortCutToText(Modifiers)),'',MB_OK);


                А результата-та и нет! Помогите МАСТЕРА!!!

                  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.
                    Да дело совсем не в ShortCutToText. Это я для себя сделал, чтобы видеть, есть ли что-нибудь в переменной Modifiers. А эта переменная пустая. Хот-Кей не регистрируется.
                      Думаю дело как раз в этом - просто ShortCutToText не покажет тебе есть ли что-то в Modifiers или нет, да и при чем тут вообще Modifiers???
                      Смотри справку по RegisterHotKey:
                      Return Values
                      If the function succeeds, the return value is nonzero.
                      If the function fails, the return value is zero.
                        QUOTE
                        да и при чем тут вообще Modifiers???


                        Ну, мне ж нужно знать, какое сочетание клавиш (CTRL и т.д.) установил пользователь.
                          2 _8989
                          QUOTE
                          Хот-Кей не регистрируется.

                          Проверь значение которое возвращает RegisterHotKey, если это FALSE, то либо данное сочетание уже используется, либо задано неверно, что скорее всего.

                          ИМХО добавь обнуление переменной Modifiers перед тем как забивать туда значения флагов.
                          Проверь совпадает ли значение WordRec(wHotKey).Lo с тем которое должно быть.... если нет то копайся с SendMessage - оно тебе что-то не то возвращает.

                          ЗЫ
                          QUOTE

                          Это я для себя сделал, чтобы видеть, есть ли что-нибудь в переменной Modifiers. А эта переменная пустая.

                          Это нормально, т.к. если в ShortCutToText передать параметр в котором нет самой горячей клавиши, только флаги ALT, CTRL и SHIFT, то функция вернет пустую строку (смотри исходник).
                          Сообщение отредактировано: rhf -
                            Всё нормально! RegisterHotKey возвращает TRUE.

                            C WordRec(wHotKey).Lo всё нормально, буква распознаеться, не распознаеться Modifiers. Помогите!!!

                            var
                            wHotKey: word;
                            Modifiers:Cardinal = 0;

                            wHotKey := SendMessage(GetDlgItem(hwnd, 303), HKM_GETHOTKEY, 0, 0);

                            if (wHotKey and scShift) <> 0 then Modifiers:=Modifiers or HOTKEYF_SHIFT;
                            if (wHotKey and scAlt) <> 0 then Modifiers:=Modifiers or HOTKEYF_ALT;
                            if (wHotKey and scCtrl ) <> 0 then Modifiers:=Modifiers or HOTKEYF_CONTROL;

                            RegisterHotKey(0, ID_HOTKEY1, Modifiers, WordRec(wHotKey).Lo);
                              _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 пользовать...
                                Спасибо!

                                RegisterHotKey(0, ID_HOTKEY1, WordRec(wHotKey).Hi, WordRec(wHotKey).Lo);


                                Это работет, но распознаёться только HOTKEYF_CONTROL, т.к. он последний. Как исправить ситуацию?
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0350 ]   [ 16 queries used ]   [ Generated: 27.04.24, 09:24 GMT ]