我很好奇知道AA和UiPath等顶级RPA工具如何模拟应用程序的击键。
我已经构建了一个使用Keybd_event来模拟击键的应用程序,但是我一直面临keybd_event的扫描代码参数的问题-因为它需要在Citrix环境中执行击键。

private void PressKeyVK(int eKeys, bool bHoldKeydown, bool bRelease)
    {
        int lScan, lExtended;

        lScan = MapVirtualKey(eKeys, 1);
        lExtended = 0;
        if (lScan == 0)
            lExtended = (int)KeyBoardEventEnums.KEYEVENTF_EXTENDEDKEY;
        lScan = MapVirtualKey(eKeys, 0);

        if (!bRelease)
            keybd_event((byte)eKeys, (byte)lScan, (uint)lExtended, UIntPtr.Zero);
        if (!bHoldKeydown)
            keybd_event((byte)eKeys, (byte)lScan, (uint)KeyBoardEventEnums.KEYEVENTF_KEYUP | (uint)lExtended, UIntPtr.Zero);
    }


如下所示的代码在citrix环境下效果很好,但是本地应用程序有问题。

lScan = MapVirtualKey(eKeys, 1); //flag 1: returns virtual key code of scan code eKeys.


如果使用标志2,则在本地应用程序中效果很好,但是SHIFT,ESC和功能键在citrix应用程序中不起作用。

请建议如何使用该标志使此代码在citrix和本地应用程序中均可工作。

API参考:

MapVirtualKey MSDN

Keybd_event MSDN

最佳答案

RPA工具针对不同的应用程序层使用不同的技术。对于本地计算机,主要通过SendMessage()PostMessage() API。对于RDP和Citrix等薄层应用程序,它模拟类似于Application.Sendkeys()的软件按键。

10-07 15:36