繁体   English   中英

如何使用 Delphi 在其他应用程序中检测 CTRL+A

[英]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()

  • 优点:随时通知您。 无需轮询,不浪费性能。
  • 缺点:这也意味着您“窃取”每个其他 window 的输入 - 由您来为重点 window 合成此组合键,以便恢复现实。 此 function 不用于拦截。

示例:您的程序/窗口没有集中,甚至可能最小化。 在记事本中,您按 CTRL+A 到 select 所有文本。 您的程序会收到通知,而记事本从未收到过这样的输入。 您可以使用SendInput()为记事本生成 CTRL+A,然后最终选择所有文本。

您可以使用Raw Input / LowLevelKeyboard 挂钩来获取按键按下/按下事件而不是轮询。

对于原始输入,您可以参考这个答案

  • 使用RegisterRawInputDevices为您的 window 注册;
  • 然后,当有任何原始输入时,您的 window 将收到WM_INPUT消息;
  • 识别钥匙;
  • 记录ctrl的状态;
  • 当按下“A”键时,检查 ctrl 状态。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM