我在Delphi中创建了一个处理某些已定义的系统范围热键的应用程序,效果很好。但是,对于某些热键功能,我必须触发/模拟某些键盘敲击,例如ALT + ENTER。当用户直接释放热键时,这很有用,但当用户仍然按下键时键盘模拟失败。
在处理键盘模拟之前,是否有办法(使用Windows API)检查是否所有键都已释放?
答案 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;