无法注册多个全局热键

时间:2009-04-13 10:37:19

标签: delphi

我一直试图注册3个热键。 我按照this示例(或this)。

如果我注册一个热键,代码正在运行。 但是,如果我尝试注册3个热键,则只有最后一个注册的热键正在工作:

procedure TFrmSettings.FormCreate;
begin
 atomN:= GlobalAddAtom(pchar('atomN'));    
 atomT:= GlobalAddAtom(pchar('atomT'));
 atomH:= GlobalAddAtom(pchar('atomH'));
end;


procedure TFrmSettings.test1;
begin
 RegisterHotShortCut(Handle, atomN, hotN.HotKey);        // first registered 
 RegisterHotShortCut(Handle, atomH, hotH.HotKey);        // second registered 
 RegisterHotShortCut(Handle, atomT, hotT.HotKey);        // third - only this works
end;

RegisterHotShortCut在上面提到的网页中声明。

function RegisterHotShortCut(const h:THandle; const Atom: integer; const ShortCut: TShortCut): Boolean;
VAR
  key : Word;
  Shift: TShiftState;
begin
  Windows.UnregisterHotKey(h, Atom);                                                    
  ShortCutToKey(ShortCut, key, shift);
  Result:= RegisterHotKey(h, Atom, ShiftState2Modifier(Shift), key);
end;

如果在上面的代码中,我评论最后一行,那么上一个热键(hotH)正在运行。这意味着我宣布一切正确,但最后一个热键控制(取消注册)其他热门。

或者以其他方式说,按下第一个注册快捷方式的组合键不会使程序进入TFrmSettings.HotyKeyMsg(VAR msg: TMessage)程序。

任何提示? 感谢。


EDIT1:

  1. 有一些简单的代码片段似乎适用于其他代码,但我真的需要让用户更改快捷方式,因此我需要ShortCutToKey程序。

  2. 我应该为每个全局快捷方式声明一个原子。右


  3. EDIT2: 的解决 如果我使用“GlobalAddAtom”函数,上述代码将失败。如果代替原子,我只使用数字1,2和3,代码可以工作。如果我使用4,5,6,则代码会再次失败。 问题(半)解决了。

5 个答案:

答案 0 :(得分:1)

我一直在为我的多个热键使用这样的代码,我不知道这是不是你想要做的: 首先声明

procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY;

然后把它们放在form.create或者其他地方

  RegisterHotKey(Handle, 1, MOD_SHIFT, VK_F9); 
  RegisterHotKey(Handle, 2, MOD_WIN, VK_F8);
  RegisterHotKey(Handle, 3, MOD_ALT, VK_F7);

和热键处理程序

procedure TForm1.WMHOTKEY(var Msg: TWMHOTKEY);
begin
  case Msg.HotKey of
    1 : ShowMEssage('this is 1 (shift+F9)');
    2 : ShowMessage('this is 2 (Win+F8)');
    3 : ShowMessage('this is 3 (ALT+F7)');
  end;
end;

在关闭你的应用时不要忘记取消注册。 已经在winxp + sp3上进行了测试,delphi 2006

答案 1 :(得分:0)

在Google上搜索RegisterHotShortCut只会返回5次点击,而对我来说则表示此功能不是正确的答案。搜索“delphi register hotkey”可以获得235000次点击,文章How to register a global hotkey(从2007年起,使用RegisterHotKey)似乎与您查看的文章(从2003年)类似。

答案 2 :(得分:0)

是的,每个快捷方式都需要一个Atom。我很好奇您在注册之前对每个人的UnregisterHotKey进行的调用。如果您之前没有注册该热键,那么您不需要它。尝试删除该行,看看是否修复了它。听起来UnregisterHotKey正在删除以前的热键,即使它有不同的原子。 。

答案 3 :(得分:0)

plz检查这段代码,它使用原子和罚款(我测试过它) http://www.swissdelphicenter.ch/torry/showcode.php?id=147

edit1:请记住,注册失败的原因是您尝试注册的组合键已经由系统或其他应用程序注册。 (见上面的链接)

答案 4 :(得分:0)

已解决如果我使用“GlobalAddAtom”功能,上述代码将失败。如果代替原子,我只使用数字1,2和3,代码可以工作。如果我使用4,5,6,则代码会再次失败。问题(半)解决了。