2009-04-13 136 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年