2009-04-13 66 views
1

我一直在尝试注册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. 我应该为每个全局快捷方式声明一个原子。对?


EDIT2: 解决 上面的代码失败,只有当我使用 “GlobalAddAtom” 功能。如果我不使用原子,而只使用数字1,2和3,那么代码就可以工作。如果我使用4,5,6,代码将再次失败。 问题(半)解决。

回答

0

已解决上面的代码只有在使用“GlobalAddAtom”函数时才会失败。如果我不使用原子,而只使用数字1,2和3,那么代码就可以工作。如果我使用4,5,6,代码将再次失败。问题(半)解决了。

0

在google上搜索RegisterHotShortCut只返回5个匹配,对我来说这表明这个函数不是正确的答案。搜索“delphi注册热键”可获得235000次点击,而文章How to register a global hotkey(从2007年开始,使用RegisterHotKey)似乎与您查看的文章(从2003年开始)类似。

+0

嗨。 RegisterHotShortCut在上面提到的网页中声明。 – Ampere 2009-04-13 11:17:56

+0

糟糕,是的,你是正确的,我看到你现在已经把它包含在问题中了。恐怕我不能进一步帮助。 – hlovdal 2009-04-13 11:51:11

+0

无论如何感谢您的帮助。 – Ampere 2009-04-13 11:58:04

0

是的,每个快捷方式都需要一个Atom。我很好奇你在注册之前要打电话给UnregisterHotKey。如果您之前没有注册该热键,则不需要它。尝试删除该行,看看是否修复它。这听起来像UnregisterHotKey正在删除以前的热键,即使它有一个不同的原子。 。

1

心中已经使用了像这样我的多个热键的代码,我不知道这是什么,你正在尝试做的: 首先声明

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

然后把这些形式。创建或elsewehere

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,德尔福2006年