我希望制作一个与游戏手柄一起使用的简单程序,并且可以控制来自程序外部的鼠标和关键字事件。我的目标是能够从沙发上控制计算机。
我目前在Update()
protected override void Update(GameTime gameTime)
{
//if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape))
// Exit();
var gamePadStates = Enum.GetValues(typeof (PlayerIndex)).OfType<PlayerIndex>().Select(GamePad.GetState);
var mouseState = Mouse.GetState();
var direction = Vector2.Zero;
const int speed = 5;
// Gamepad
foreach (var input in gamePadStates.Where(x => x.IsConnected))
{
if (input.IsButtonDown(Buttons.DPadDown))
direction.Y += 1;
if (input.IsButtonDown(Buttons.DPadUp))
direction.Y -= 1;
if (input.IsButtonDown(Buttons.DPadLeft))
direction.X -= 1;
if (input.IsButtonDown(Buttons.DPadRight))
direction.X += 1;
direction.X += input.ThumbSticks.Left.X;
direction.Y -= input.ThumbSticks.Left.Y;
}
var oldPos = new Vector2(mouseState.X, mouseState.Y);
if (direction != Vector2.Zero)
{
var newPos = oldPos;
direction *= speed;
newPos += direction;
//newPos.X = MathHelper.Clamp(newPos.X, 0, GraphicsDevice.DisplayMode.Width);
//newPos.Y = MathHelper.Clamp(newPos.Y, 0, GraphicsDevice.DisplayMode.Height);
Mouse.SetPosition((int)newPos.X, (int)newPos.Y);
System.Diagnostics.Debug.WriteLine("New mouse pos = {0}, {1}", newPos.X, newPos.Y);
}
base.Update(gameTime);
}
修改 为了发送按键,我找到了this库
答案 0 :(得分:3)
在XNA中执行此操作与正常C#相同。要使用下面的代码,请确保使用System.Runtime.InteropServices;
命名空间。
免责声明:我会考虑这个有点“脏”的代码,它使用user32.dll
来调用Windows中的点击,但它确实是唯一的方法。 (改编自here)
首先,您需要4个常量才能轻松使用不同类型的点击:
private const int MouseEvent_LeftDown = 0x02;
private const int MouseEvent_LeftUp = 0x04;
private const int MouseEvent_RightDown = 0x08;
private const int MouseEvent_RightUp = 0x10;
然后您需要挂钩鼠标事件:
[DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)]
public static extern void MouseEvent(uint dwFlags, uint dx, uint dy, uint cButtons,uint dwExtraInfo);
您现在可以编写创建鼠标点击的方法:
LeftClick(int x, int y)
{
MouseEvent(MouseEvent_LeftDown | MouseEvent_LeftUp, x, y, 0, 0);
}
RightClick(int x, int y)
{
MouseEvent(MouseEvent_RightDown | MouseEvent_RightUp, x, y, 0, 0);
}
...等等。您可以看到如何调整它以创建保持/拖动事件以模仿更多功能。
注意:我不确定这是否会在MouseState
注册,但不应该使用,因为您正在尝试使用它来控制计算机,游戏永远不需要使用鼠标状态。