我有一个带有项目的组合框 - 热键。我想将每一个都关联到一个 Win32 热键,例如 F2 到 VK_F2,然后用 RegisterHotkey 调用那个。最好的方法是什么?我查找了一些东西,也许十六进制值会有所帮助,但它并没有说明如何使用它们。谢谢。
很抱歉,我无法提供更多信息,但我不知道我还应该包括什么:/
我有一个带有项目的组合框 - 热键。我想将每一个都关联到一个 Win32 热键,例如 F2 到 VK_F2,然后用 RegisterHotkey 调用那个。最好的方法是什么?我查找了一些东西,也许十六进制值会有所帮助,但它并没有说明如何使用它们。谢谢。
很抱歉,我无法提供更多信息,但我不知道我还应该包括什么:/
您可以使用TextToShortCut
,然后将返回的值解码TShortCut
为所需的值RegisterHotKey
:
var
Shortcut: TShortCut;
Flags: Cardinal;
Key : Word;
Shift : TShiftState;
begin
ShortCut := TextToShortCut(ComboBox1.Items[ComboBox1.ItemIndex]);
Flags := 0;
Key := 0;
Shift := [];
ShortCutToKey(Shortcut, Key, Shift);
if ssCtrl in Shift then
Flags := Flags or MOD_CONTROL;
if ssShift in Shift then
Flags := Flags or MOD_SHIFT;
if ssAlt in Shift then
Flags := Flags or MOD_ALT;
// You should check the return value of RegisterHotKey - it returns
// a BOOL indicating success or failure. Omitted because your
// question isn't about using RegisterHotKey.
RegisterHotKey(Application.Handle, YourHotKeyID, Flags, Key );
end;
TextToShortCut
并且ShortCutToKey
都在Menus
单元中定义。
YourHotKeyID
wParam
是您定义的 $0000-$BFFF 之间的值,当您收到WM_HOTKEY
消息时将传递给您的应用程序。
说了这么多,您应该重新考虑您对 UI 控件的选择。如果您使用 a THotKey
,用户只需按下他们想要使用的组合键(而不是滚动列表)。然后,您可以使用THotKey.HotKey
代替ShortCut
示例代码中的变量(您可以将其直接传递给ShortCutToKey
,并完全消除ShortCut
变量):
ShortCutToKey(HotKey1.HotKey, Key, Shift);
// ... remainder of code
而且,期待您即将发表的评论:),如何捕获和处理WM_HOTKEY
消息以及如何处理您注册的多个热键应该是一个新问题。这个是专门关于组合框和热键的;如何处理被按下的热键是完全不同的。