如何将组合框中的项与Win32 API热键关联?

时间:2012-04-14 14:30:16

标签: delphi

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

对不起,我无法提供更多信息,但我不知道还应该包括哪些内容:/

1 个答案:

答案 0 :(得分: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;

TextToShortCutShortCutToKey都在Menus单元中定义。

YourHotKeyID是您定义的$ 0000- $ BFFF之间的值,当您收到wParam消息时,该值将在WM_HOTKEY中传递到您的应用。

尽管如此,您应该重新考虑您选择的UI控件。如果您使用THotKey,则用户只需按下要使用的组合键(而不是滚动列表)。然后,您可以使用THotKey.HotKey代替示例代码中的ShortCut变量(您可以将其直接传递给ShortCutToKey,并完全删除ShortCut变量):< / p>

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

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