将快捷键热键组合转换为真实键?

时间:2013-11-18 05:52:07

标签: .net vb.net winapi hotkeys shortcut-key

如何转换快捷方式的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 个答案:

答案 0 :(得分:1)

在CommCtrl.h中有:

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

1601是hexa中的641。

低位字节为0x41,十进制为65:'A'

高位字节为0x06,即HOTKEYF_CONTROL + HOTKEYF_ALT。

要将hoy键设置为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位设置为Key,高8位由3个可能修饰符的按位组合组成。