Windows 服务器中的 SendInput

问题描述 投票:0回答:1

我想在 Windows Server 中模拟鼠标移动(桌面体验)。我正在使用 C# 中的 Window 函数

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);
}

当我保持远程桌面打开时,它工作正常,但是当我关闭会话时,

SendInput()
返回0x5(ERROR_ACCESS_DENIED)。

我在虚拟机中尝试过同样的操作。每当我关闭虚拟机连接窗口时,

SendInput()
都会失败。

知道如何在 Windows Server 中使用

SendInput()
而无需保持连接打开吗?

winapi windows-server
1个回答
0
投票

我还没有找到使用 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 的一个很酷的事情是点击可以发送到最小化的窗口。但是,对于键盘消息而言并非如此,它们仅在窗口聚焦时才有效。

© www.soinside.com 2019 - 2024. All rights reserved.