[英]How to detect CTRL+A in other applications using Delphi
每当用户按下它们时,我都需要检测 Ctrl+A 击键。 这是我到目前为止所做的
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if (GetKeyState(65)>0) then
begin
caption:='CTRL+A Pressed!';
end else
begin
caption:='Not pressed';
end;
end;
如何知道是否按下了 CTRL 键?
每当用户按下它们时,我都需要检测 Ctrl+A 击键。
如果您真的是这个意思,那么请考虑RegisterHotkey()
。
示例:您的程序/窗口没有集中,甚至可能最小化。 在记事本中,您按 CTRL+A 到 select 所有文本。 您的程序会收到通知,而记事本从未收到过这样的输入。 您可以使用SendInput()
为记事本生成 CTRL+A,然后最终选择所有文本。
您可以使用Raw Input / LowLevelKeyboard 挂钩来获取按键按下/按下事件而不是轮询。
对于原始输入,您可以参考这个答案,
RegisterRawInputDevices
为您的 window 注册;WM_INPUT
消息;C++ 中的示例:
LRESULT CALLBACK WindProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
static BOOL ctrl_state = FALSE; //up
if (Msg == WM_INPUT)
{
HRAWINPUT hRawInput = (HRAWINPUT)lParam;
RAWINPUT input = { 0 };
UINT size = sizeof(input);
GetRawInputData(hRawInput, RID_INPUT, &input, &size, sizeof(RAWINPUTHEADER));
switch (input.data.keyboard.VKey)
{
case VK_CONTROL:
if(input.data.keyboard.Flags & RI_KEY_BREAK)
ctrl_state = TRUE;
else
ctrl_state = FALSE;
break;
case 0x41:
if (input.data.keyboard.Flags & RI_KEY_BREAK)
OutputDebugString(L"Ctrl + A pressed");
break;
default:
break;
}
}
return DefWindowProc(hWnd, Msg, wParam, lParam);
}
它对我有用。
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if (GetKeyState(VK_CONTROL)<0) and (GetKeyState(65)<0) then
begin
caption:='Pressed!';
end else
begin
caption:='';
end;
end;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.