【问题标题】:Send keyboard and mouse events to DirectX application in C#?在 C# 中将键盘和鼠标事件发送到 DirectX 应用程序?
【发布时间】:2011-05-11 14:15:56
【问题描述】:

我需要将全局击键和鼠标事件发送到另一个使用 DirectX 的应用程序。 (除了窗口本身没有控件/句柄)
例如,我需要按住 X 键 2 秒钟然后松开它...
我需要在坐标 x:600 和 y:350 上按下右键,将鼠标向下移动 100 像素,然后松开右键。
我还需要同时按下 2 个或更多键,例如 X 和 Y,并在 2 秒后停止 X,再在 2 秒后停止 Y。
所以基本上我需要完全控制输入系统...
如果我可以在最大化或在后台控制应用程序,那也将是理想的。 (可选)

对于怀疑论者... 老师为我们学校制作了一个用于绘图的 DirectX 应用程序。我被要求制作一个在其上绘制样本的应用程序,例如火车或花之类的东西...我将阅读图像并使用输入来设置颜色并单击画布...

【问题讨论】:

  • 听起来像是游戏机器人编程 ;-)
  • 儿童绘图应用程序。学校项目!
  • 说实话,您的帖子与原来的问题不同,变得相当宽泛。
  • @DanielB 没关系。这听起来确实像机器人编程。 @先生。失望什么意思?

标签: c# directx mouseevent sendkeys sendinput


【解决方案1】:

有一些可能性。你可以看看System.Windows.Forms.SendKeys,你可以从gdi32.dll或从user32.dllSetCursorPos()mouse_event调用一些Win32函数,比如SetForegroundWindow()LockSetForegroundWindow()来执行点击:

这里是我不久前使用的鼠标事件的 sn-p。

    /**
     * Mouse functions
     */
    [DllImport("user32.dll", ExactSpelling=true)]
    public static extern long mouse_event(Int32 dwFlags, Int32 dx, Int32 dy, Int32 cButtons, Int32 dwExtraInfo);

    [DllImport("user32.dll", ExactSpelling=true)]
    public static extern void SetCursorPos(Int32 x, Int32 y); 

    public const Int32 MOUSEEVENTF_ABSOLUTE = 0x8000;
    public const Int32 MOUSEEVENTF_LEFTDOWN = 0x0002;
    public const Int32 MOUSEEVENTF_LEFTUP = 0x0004;
    public const Int32 MOUSEEVENTF_MIDDLEDOWN = 0x0020;
    public const Int32 MOUSEEVENTF_MIDDLEUP = 0x0040;
    public const Int32 MOUSEEVENTF_MOVE = 0x0001;
    public const Int32 MOUSEEVENTF_RIGHTDOWN = 0x0008;
    public const Int32 MOUSEEVENTF_RIGHTUP = 0x0010;

    public static void PerformLeftKlick(Int32 x, Int32 y)
    {
        SetCursorPos(x, y);
        mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
        mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
    }

希望能将您推向正确的方向。一个好的资源是http://pinvoke.net/

【讨论】:

  • @DanielB 但是我如何发送按键 X 按下并在一段时间后释放按键 X?
  • 这是一个我没有答案的问题。也许也可以通过pinvoking。
  • 鼠标还是键盘? DX 窗口在前台?
  • 没关系,但您能帮我找到正确的方法吗? :C
  • 您是否发送了 KEYDOWN 并在一段时间后发送了 KEYUP?也许这篇文章可以帮助social.msdn.microsoft.com/Forums/en-US/netfxcompact/thread/…
【解决方案2】:

如果您想使用 C# 库来简化您的工作,请阅读以下链接 -

http://www.codeproject.com/Articles/117657/InputManager-library-Track-user-input-and-simulate

除了 .Net C#,您还可以使用其他语言替代方案,例如在 Java 中,不会混淆直接 x 或普通输入 -

http://docs.oracle.com/javase/7/docs/api/java/awt/Robot.html

【讨论】:

  • 嗨 Vercas,这是一个新的搜索者,可以帮助他/她很大,因为我们都有经验回答查询:)
  • 我一直在研究这个问题,我发现这个库工作得很好,除了它使用的是 SendInput(User32.dll 函数)。不幸的是,这不适用于使用 DirectInput 的 DirectX 游戏。我仍在寻找解决方案,但我怀疑这将涉及编写键盘驱动程序。
  • @Richard 如果您可以使用 Java 或 Java 程序的包装器来避免 Direct X 输入问题,您可以按照建议使用 Robot 类。或者任何类似的解决方案(我不确定哪个与机器人类似)都可以解决这个问题。
  • 感谢您的提示。但是,Java 不是我的技能。相反,我安装了 Interception 键盘驱动程序并与之挂钩。它使我免于自己写一个。使用它,它就像从键盘发送一样。唯一的缺点是当我调试时,我不能使用我的普通热键进入等等,因为由于调试器,键盘界面被占用了。但效果很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-28
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多