C#-如何在不使用winform的情况下在命令行exe中获得鼠标点击

本文关键字:exe 鼠标 命令行 C#- winform 情况下 | 更新日期: 2023-09-27 18:29:14

我看到了一些"相似"的问题。但答案总是要求提问者使用winform。我需要100%的控制台应用程序,它可以挂接到Windows消息队列并给鼠标点击点。鼠标点击可以发生在窗口中的任何位置。

我所做的:我完美地使用了winforms。事实上,我从一个博客中复制了大部分代码。它正在发挥作用。但我目前的项目是"自动化测试"。在这里,我们必须将大多数应用程序作为控制台应用程序启动。否则,操作将变得一团糟。我尝试了IMessageFilter,然后我知道它需要表单。

有人能指引我正确的方向吗?

注意:我使用的是Windows7、.Net 4.5、Visual Studio Express-2012

编辑:

我根本不在乎控制台。我的目标是获取鼠标点击坐标(屏幕中的任何位置)。这意味着首先我会从控制台启动程序,然后在屏幕上点击。控制台应该立即打印出鼠标点击的坐标。

C#-如何在不使用winform的情况下在命令行exe中获得鼠标点击

这是我对您需要做的事情的看法,尽管我对是否理解这个问题还有点模糊。

  1. 创建一个普通控制台应用程序
  2. 安装鼠标挂钩WH_MOUSE_LL
  3. 随意处理挂钩中的鼠标消息,例如在控制台上输出信息

用WinForm编写程序,但制作一个不可见的应用程序。

然后,将此应用程序连接到父控制台,并在其中写入您想要的内容:

NativeMethods.AttachConsole(NativeMethods.ATTACH_PARENT_PROCESS);
Console.WriteLine("Coordinate : " + mouse.X);

使用这个类可以做到这一点:

internal static class NativeMethods
{
    internal const int ATTACH_PARENT_PROCESS = -1;
    /// <summary>
    /// Allocates a new console for the calling process.
    /// </summary>
    /// <returns>nonzero if the function succeeds; otherwise, zero.</returns>
    /// <remarks>
    /// A process can be associated with only one console,
    /// so the function fails if the calling process already has a console.
    /// http://msdn.microsoft.com/en-us/library/ms681944(VS.85).aspx
    /// </remarks>
    [DllImport("kernel32.dll", SetLastError = true)]
    internal static extern int AllocConsole();
    [DllImport("kernel32.dll")]
    internal static extern bool AttachConsole(int dwProcessId);
    /// <summary>
    /// Detaches the calling process from its console.
    /// </summary>
    /// <returns>nonzero if the function succeeds; otherwise, zero.</returns>
    /// <remarks>
    /// If the calling process is not already attached to a console,
    /// the error code returned is ERROR_INVALID_PARAMETER (87).
    /// http://msdn.microsoft.com/en-us/library/ms683150(VS.85).aspx
    /// </remarks>
    [DllImport("kernel32.dll", SetLastError = true)]
    internal static extern int FreeConsole();
}