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