Windows Server 中的 SendInput

SendInput in a Windows Server

提问人:Greg 提问时间:11/3/2023 最后编辑:Greg 更新时间:11/9/2023 访问量:42

问:

我想在 Windows Server(桌面体验)中模拟鼠标移动。我正在使用 C# 中 Windows 的函数 SendInput(),并且以下代码正在服务器中运行。

using Windows.Win32;
using Windows.Win32.UI.Input.KeyboardAndMouse;

for (int i = 0; i < 5; i += 1)
{
    var inputs = new INPUT[]
    {
        new()
        {
            type = INPUT_TYPE.INPUT_MOUSE,
            Anonymous = new INPUT._Anonymous_e__Union
            {
                mi = new MOUSEINPUT
                {
                    dx = 0,
                    dy = 0,
                    mouseData = 0,
                    dwFlags = MOUSE_EVENT_FLAGS.MOUSEEVENTF_ABSOLUTE | MOUSE_EVENT_FLAGS.MOUSEEVENTF_MOVE,
                    time = 0,
                    dwExtraInfo = 0,
                },
            },
        }
    };

    if (PInvoke.SendInput(inputs, Marshal.SizeOf<INPUT>()) == 0)
    {
        throw new Win32Exception(Marshal.GetLastWin32Error());
    }

    Thread.Sleep(2000);
}

当我保持远程桌面打开时,它运行良好,但在关闭会话时返回0x5 (ERROR_ACCESS_DENIED)。SendInput()

我在虚拟机中尝试过同样的方法。每当我关闭虚拟机连接窗口时,都会失败。SendInput()

知道如何在 Windows Server 中使用而不保持连接打开吗?SendInput()

winapi 窗口服务器

评论

0赞 Simon Mourier 11/3/2023
这似乎是有道理的,它不仅有效。您可以尝试调整系统或提升应用程序的权限 medium.com/@im-jqueue/... learn.microsoft.com/en-us/windows/win32/winauto/...... learn.microsoft.com/en-us/windows/security/threat-protection/......(未经测试)

答:

0赞 Greg 11/9/2023 #1

我还没有找到使用 SendInput() 使它工作的方法。但是,使用 SendMessage() 时鼠标点击效果很好:

PInvoke.SendMessage(hwnd, PInvoke.WM_LBUTTONDOWN, (nuint)MODIFIERKEYS_FLAGS.MK_LBUTTON, PInvoke.MAKELPARAM(X, Y));
PInvoke.SendMessage(hwnd, PInvoke.WM_LBUTTONUP, (nuint)MODIFIERKEYS_FLAGS.MK_LBUTTON, PInvoke.MAKELPARAM(X, Y));

SendMessage 很酷的地方在于,点击可以发送到最小化的窗口。但是,键盘消息并非如此,它们仅在窗口聚焦时才有效。