Преобразовать комбинацию горячих клавиш в реальные клавиши?
Как я мог преобразовать свойство 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 возможных модификаторов.