C#模拟鼠标移动不影响前台应用
C# Simulate mouse movement does not affect foreground application
我有两台机器:A和B
在 A 上,我获取当前(本地)鼠标位置 (x & y) 并通过我的本地网络将该鼠标位置发送到机器 B。
机器 B 获取传入位置 X 和 Y,并使用找到的示例 here 模拟鼠标移动。一切正常,花花公子 - 我可以看到鼠标在移动,但由于某种原因,它不会影响机器 B 前台的 Window。
这是什么"Window"?它是一个 Unity3D 应用程序 - 一个游戏。我希望鼠标移动会导致游戏中的相机移动。有趣的是,如果我按照描述进行操作,然后停止在机器 A 上移动鼠标...然后通过触摸板(或普通鼠标)在机器 B 上移动鼠标,它会按预期移动游戏中的相机!
这是怎么回事?
看来,无论出于何种原因,代码取自 here
[DllImport("user32.dll")]
static extern bool SetCursorPos(int X, int Y);
不工作...正常!如预期的那样,我的鼠标会在远程计算机上移动,但我带到前台的应用程序没有检测到鼠标移动。
但是,我确实设法使用 mouse_event
:
让它工作
[Flags]
public enum MouseEventFlags
{
LeftDown = 0x00000002,
LeftUp = 0x00000004,
MiddleDown = 0x00000020,
MiddleUp = 0x00000040,
Move = 0x00000001,
Absolute = 0x00008000,
RightDown = 0x00000008,
RightUp = 0x00000010
}
[DllImport("user32.dll")]
private static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);
public static void MouseEvent(MouseEventFlags value, Point position)
{
MousePoint position = position;
mouse_event
((int)value,
position.X,
position.Y,
0,
0)
;
}
[StructLayout(LayoutKind.Sequential)]
public struct MousePoint
{
public int X;
public int Y;
public MousePoint(int x, int y)
{
X = x;
Y = y;
}
}
要使用它,只需调用:
mouse_event(MouseEventFlags.Move,new MousePoint{X = YOUR_X, Y = YOUR_Y});
所有功劳归于此SO answer。
我有两台机器:A和B
在 A 上,我获取当前(本地)鼠标位置 (x & y) 并通过我的本地网络将该鼠标位置发送到机器 B。 机器 B 获取传入位置 X 和 Y,并使用找到的示例 here 模拟鼠标移动。一切正常,花花公子 - 我可以看到鼠标在移动,但由于某种原因,它不会影响机器 B 前台的 Window。
这是什么"Window"?它是一个 Unity3D 应用程序 - 一个游戏。我希望鼠标移动会导致游戏中的相机移动。有趣的是,如果我按照描述进行操作,然后停止在机器 A 上移动鼠标...然后通过触摸板(或普通鼠标)在机器 B 上移动鼠标,它会按预期移动游戏中的相机!
这是怎么回事?
看来,无论出于何种原因,代码取自 here
[DllImport("user32.dll")]
static extern bool SetCursorPos(int X, int Y);
不工作...正常!如预期的那样,我的鼠标会在远程计算机上移动,但我带到前台的应用程序没有检测到鼠标移动。
但是,我确实设法使用 mouse_event
:
[Flags]
public enum MouseEventFlags
{
LeftDown = 0x00000002,
LeftUp = 0x00000004,
MiddleDown = 0x00000020,
MiddleUp = 0x00000040,
Move = 0x00000001,
Absolute = 0x00008000,
RightDown = 0x00000008,
RightUp = 0x00000010
}
[DllImport("user32.dll")]
private static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);
public static void MouseEvent(MouseEventFlags value, Point position)
{
MousePoint position = position;
mouse_event
((int)value,
position.X,
position.Y,
0,
0)
;
}
[StructLayout(LayoutKind.Sequential)]
public struct MousePoint
{
public int X;
public int Y;
public MousePoint(int x, int y)
{
X = x;
Y = y;
}
}
要使用它,只需调用:
mouse_event(MouseEventFlags.Move,new MousePoint{X = YOUR_X, Y = YOUR_Y});
所有功劳归于此SO answer。