0

我有一个带有项目的组合框 - 热键。我想将每一个都关联到一个 Win32 热键,例如 F2 到 VK_F2,然后用 RegisterHotkey 调用那个。最好的方法是什么?我查找了一些东西,也许十六进制值会有所帮助,但它并没有说明如何使用它们。谢谢。

很抱歉,我无法提供更多信息,但我不知道我还应该包括什么:/

4

1 回答 1

1

您可以使用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单元中定义。

YourHotKeyIDwParam是您定义的 $0000-$BFFF 之间的值,当您收到WM_HOTKEY消息时将传递给您的应用程序。

说了这么多,您应该重新考虑您对 UI 控件的选择。如果您使用 a THotKey,用户只需按下他们想要使用的组合键(而不是滚动列表)。然后,您可以使用THotKey.HotKey代替ShortCut示例代码中的变量(您可以将其直接传递给ShortCutToKey,并完全消除ShortCut变量):

ShortCutToKey(HotKey1.HotKey, Key, Shift);
// ... remainder of code

而且,期待您即将发表的评论:),如何捕获和处理WM_HOTKEY消息以及如何处理您注册的多个热键应该是一个新问题。这个是专门关于组合框和热键的;如何处理被按下的热键是完全不同的。

于 2012-04-14T21:14:03.543 回答