1

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

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

有人可以指导我正确的方向吗?

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

编辑:

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

4

2 回答 2

3

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

  1. 创建一个普通的控制台应用程序。
  2. 安装鼠标钩,WH_MOUSE_LL
  3. 随意处理来自钩子的鼠标消息,例如通过在控制台上输出信息。
于 2013-08-28T19:59:45.660 回答
1

在 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();
}
于 2013-08-28T12:09:05.897 回答