2013-11-18 6 views
0

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

Я использую интерфейс 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.

EDIT:

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

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) 

UPDATE:

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

Во-первых, я добавил это перечисление:

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 в гекса.

Low Byte Order является 0x41, 65 в десятичной системе счисления: 'A'

высокого порядка Байт 0x06, то есть HOTKEYF_CONTROL + HOTKEYF_ALT.

Чтобы Установить Hoy ключ к SHIFT + CTRL + 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 возможных модификатора.

+0

Спасибо за всю информацию, но мне нужно немного больше помочь сделать это, вы сказали, как перевести 1601, но также мне нужно перевести комбинацию перечислимых ключей (номер 262226) на тот номер 1601, который шаги, которые мне нужно сделать. Чтобы дать вам пример, я хотел бы установить горячую клавишу следующим образом: «Dim hotkey = Keys.ControlKey или Keys.Shift or Keys.A», тогда процесс перевода этих ключей в правильное значение (1601) необходимо автоматизировать и а не вручную – ElektroStudios

+0

Я обновил свой вопрос, добавив новый код, пожалуйста, ознакомьтесь с обновлением, спасибо. – ElektroStudios

+0

Done !: 'DirectCast (lnk, IShellLinkW) .SetHotkey (Convert.ToInt32 (CInt (HotKey.Item1 & Hex (HotKey.Item2)), 16))' – ElektroStudios