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

时间:2013-08-28 10:46:44

标签: c# .net windows

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

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

任何人都可以指导我正确的方向吗?

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

修改

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

2 个答案:

答案 0 :(得分:3)

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

  1. 创建一个普通的控制台应用程序。
  2. 安装鼠标挂钩WH_MOUSE_LL
  3. 根据需要处理来自挂钩的鼠标消息,例如在控制台上输出信息。

答案 1 :(得分: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();
}