提问人:Greg 提问时间:11/3/2023 最后编辑:Greg 更新时间:11/9/2023 访问量:42
Windows Server 中的 SendInput
SendInput in a Windows Server
问:
我想在 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()
答:
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 很酷的地方在于,点击可以发送到最小化的窗口。但是,键盘消息并非如此,它们仅在窗口聚焦时才有效。
评论