На главную Наши проекты:
Журнал   ·   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
  
> 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, т.к. он последний. Как исправить ситуацию?
                                  так это не будет работать т.к. для RegisterHotKey надо использовать MOD_ALT, MOD_CONTROL, MOD_SHIFT, а не HOTKEYF_ALT, HOTKEYF_CONTROL, HOTKEYF_SHIFT - у них и значения разные (т.е. MOD_CONTROL=4, а HOTKEYF_CONTROL=$02)
                                    ИМХО, надо первым параметром передавать хэндл окна, на которое клеится хоткей smile.gif Как оно вообще работает - удивляюсь smile.gif 0 не катит, я писал в одной своей проге Form1.Handle - и все пахало, а вот как расшифровывал модифер - не скажу, т.к. исходники навернулись...
                                      Цитата
                                      ИМХО, надо первым параметром передавать хэндл окна, на которое клеится хоткей  Как оно вообще работает - удивляюсь  0 не катит

                                      Ну почему же, если в качестве дескриптора окна передаётся 0, то сообщение будет ассоциировано с данным потоком и ловить его нужно в цикле обработки сообщений.

                                      2 _8989 пиши примерно следующее

                                      ...
                                      if (WordRec(wHotKey).Hi and HOTKEYF_ALT) <> 0 then Modifiers:=Modifiers or MOD_ALT;
                                      if ......
                                      ...
                                        В общем, я нашел код для этого. Реально рабочий. Только там нужОн 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...
                                          ВСЕМ огромное спасибо за помощь! Особенную благодарность хочу выразить rhf. Еще раз - Сенкс!
                                            2_8989
                                            Так подними ему рейтинг-то, раз тебе помогли его ответы.
                                              Как?
                                                А.. ну ты же гость. Сначала зарегится как минимум надо.
                                                  как делавл я
                                                  [code]
                                                  .......................
                                                  Procedure Hot(var Message:TMessage);message WM_HOTKEY;
                                                  ..........
                                                  RegisterHotKey(Wnd.Handle,0,0,VK_TAB);
                                                  ...............
                                                  Procedure Twnd1.Hot;
                                                  Begin
                                                  ..............
                                                  end;
                                                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                                  0 пользователей:


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