Windows api:等到系统范围内释放所有键盘键

时间:2015-08-21 15:06:38

标签: windows delphi keyboard hotkeys

我在Delphi中创建了一个处理某些已定义的系统范围热键的应用程序,效果很好。但是,对于某些热键功能,我必须触发/模拟某些键盘敲击,例如ALT + ENTER。当用户直接释放热键时,这很有用,但当用户仍然按下键时键盘模拟失败。

在处理键盘模拟之前,是否有办法(使用Windows API)检查是否所有键都已释放?

2 个答案:

答案 0 :(得分:0)

使用GetAsyncKeyState,因为此API反映了键盘的真实当前状态,而不是您的应用上次调用GetMessage时的状态。只需编写一个循环,为0到0xFF之间的每个值调用它。

  

如果设置了最高有效位,则键为关闭

答案 1 :(得分:0)

感谢@David Ching和@David Heffernan(两个戴维斯!)解决方案不仅是测试键盘输入,还有鼠标输入或更好的输入设备状态。

由于以下原因,还包括鼠标:

  { Virtual Keys, Standard Set }
  VK_LBUTTON = 1;
  VK_RBUTTON = 2;
  VK_MBUTTON = 4;  { NOT contiguous with L & RBUTTON }

因此,如果不想测试鼠标按钮,则必须将其从循环中排除。最好还要检查这些因为鼠标必须使用热键。最好检查输入上的所有内容是否空闲。

function isUserInputDevicesInUse() : Boolean;  // Keyboard pressed / mouse pressed?
var
 i            : LongInt;

begin
 i:=256;
 Result:=FALSE;

 while( i > 0 ) and ( NOT Result ) do
 begin
  Dec( i );
  Result:=( GetAsyncKeyState(i) < 0 );
 end;
end;

function isUserInputDevicesIdle() : Boolean;
begin
 Result:=NOT isUserInputDevicesInUse();
end;