我正在尝试在一个通信程序中编写一个“咳嗽按钮”,但该程序不总是处于焦点状态。我已经编写了代码来静音和取消静音麦克风(MMDevApi),并且它运行得非常完美。我设置了一个全局热键,这个热键可以很好地设置静音。现在问题来了。我如何告诉程序当热键被释放时?我尝试了在代码中使用计时器,但它的行为很奇怪。我按住我的热键,麦克风立即静音,然后在计时器的间隔之后,它会取消静音,持续时间似乎是计时器间隔的一半,然后再次静音并保持静音状态。如果没有计时器,它将完美地静音并保持静音状态。我真的不想(或认为这样做没有用)按下第二个键来取消静音麦克风。
//here is my register hot key code !
CoughKeyWnd := AllocateHwnd(CoughKeyWndProc);
CoughKey := GlobalAddAtom('CoughKey');
if CoughKey <> 0 then
RegisterHotKey(CoughKeyWnd, CoughKey, MOD_CONTROL, VK_OEM_3);
//the procedure
procedure TForm1.CoughKeyWndProc(var Message: TMessage);
begin
if Message.Msg = WM_HOTKEY then
begin // to prevent recalling mute
if CoughOn = FALSE then
begin
CoughOn := True;
CoughOff.SetMute(1,@GUID_NULL);
end;
Timer1.Enabled := FALSE;
Timer1.Enabled := True;
end
else
begin
Message.Result := DefWindowProc(CoughKeyWnd, Message.Msg, Message.WParam, Message.LParam);
end;
//and finally the ontimer !
procedure TForm1.JvTimer1Timer(Sender: TObject);
begin
CoughOff.SetMute(0,@GUID_NULL);
Timer1.Enabled := False;
CoughOn := False;
end;
WM_HOTKEY
通知是在按下后发送的,而不是松开后发送的。我会添加一个[winapi]
标签来扩大你的问题的受众范围,并确认我的想法。 - Free Consulting