如何转换快捷方式的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))
答案 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作为低位字节,并从高位字节手动添加修饰符键。
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个可能修饰符的按位组合组成。