Преобразовать комбинацию горячих клавиш в реальные клавиши?

Как я мог преобразовать свойство Hotkey ярлыка для представления комбинации в тип String или напрямую преобразовать значение в правильную комбинацию?

Я использую IShellLink интерфейс для получения информации из ярлыков.

Private Shared lnk_hotkey As Short

interface IShellLinkW...
    Sub GetHotkey(ByRef pwHotkey As Short)
    Sub SetHotkey(ByVal wHotkey As Short)
end interface...

function to retrieve the hotkey...
    DirectCast(lnk, IPersistFile).Load(ShortcutFile, 0) ' Load the shortcut
    DirectCast(lnk, IShellLinkW).GetHotkey(lnk_hotkey) ' Retrieve the Hotkey
    Return lnk_hotkey ' Return the hotkey
end function...

Теперь у меня есть ярлык, который для свойства Hotkey имеет это:

CONTROL + ALT + A

Ну, то Keys Перечисление говорит об этом:

  Keys.ControlKey = 17
  Keys.Alt = 262144
  Keys.A = 65

Так что для такой комбинации, как Keys.ControlKey Or Keys.Alt Or Keys.A Итого всего: 262226, но IShellLink возвращает 1601, Тогда какое ключевое представление используется это?

Мне нужно как решение для правильного представления сочетания клавиш, так и для установки нового настраиваемого сочетания клавиш для Sub SetHotkey(ByVal wHotkey As Short) mehotd.

РЕДАКТИРОВАТЬ:

О, и вот что я попробовал:

    Dim ShortcutInfo As Shortcut.ShortcutInfo =
        Shortcut.GetInfo("File.lnk")

    MsgBox(ShortcutInfo.Hotkey) ' Result: 1601

    MsgBox([Enum].Parse(GetType(Keys), ShortcutInfo.Hotkey).ToString)
    ' Result: 1601

    Dim k As New KeysConverter
    MsgBox(k.ConvertToString(1601).ToString)
    ' Result: (empty)

ОБНОВИТЬ:

Я пытаюсь это...

Сначала я добавил это перечисление:

Public Enum HotkeyModifiers As Short
    SHIFT = 1
    CONTROL = 2
    ALT = 4
End Enum

Таким образом, процесс должен автоматизировать задачу, но я не знаю, что теперь делать здесь:

Public Shared Sub CreateShortcut(blah blah blah... 
                                 ByVal HotKey As Tuple(Of HotkeyModifiers, Keys))

MsgBox(CInt(HotKey.Item1 & HotKey.Item2))
' Result: 665

' I need to translate the 665 into the right value, 1601.

end sub

Вот как я называю метод:

Shortcut.CreateShortcut(Tuple.Create(HotkeyModifiers.CONTROL Or HotkeyModifiers.ALT, Keys.A))

1 ответ

Решение

В CommCtrl.h есть:

#define HOTKEYF_SHIFT           0x01
#define HOTKEYF_CONTROL         0x02
#define HOTKEYF_ALT             0x04

1601 - это 641 в гекса.

Младший байт 0x41, 65 в десятичном виде: "A"

Старший байт порядка 0x06, то есть HOTKEYF_CONTROL + HOTKEYF_ALT.

Чтобы установить Hoy Key на SHIFT+CONTROL+B, используйте 0x342 (834)

AFAIK, вы не можете использовать KeysConverter с комбинацией двух байтов. Используйте KeysConverter для младшего байта и вручную добавьте ключи модификаторов из старшего байта.

Документация IShellLink::SetHotkey гласит:

wHotkey
Type: WORD
The new keyboard shortcut. 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 values specified in the description of
the IShellLink::GetHotkey method.

Вы должны сделать 16-битное значение, причем младшие 8 битов будут установлены в ключ, а верхние 8 битов будут сделаны из побитовой комбинации из 3 возможных модификаторов.

Другие вопросы по тегам