我看到了一些“相似”的问题。但答案总是要求提问者使用winform。我需要100%的控制台aplplication,它可以挂钩到Windows消息队列并给出鼠标点击点。鼠标单击可以在窗口的任何位置发生。
我做了什么:我使用winforms完美地做到了这一点。实际上我从一个博客复制了大部分代码。这是工作。但我目前的项目是“自动化测试”。这里我们必须将大多数应用程序作为控制台应用程序启动。否则操作将变得一团糟。我尝试使用IMessageFilter,然后我才知道它需要表格。
任何人都可以指导我正确的方向吗?
注意:我使用的是Windows7,.Net4.5,Visual Studio Express - 2012
修改
我根本不关心控制台。我的目标是获取鼠标点击坐标(屏幕中的任何位置)。这意味着首先我将从控制台中获取该程序,然后我将在屏幕上进行一些点击。控制台应立即打印出鼠标点击的坐标。
答案 0 :(得分:3)
这是我对你需要做的事情的看法,虽然我对是否理解这个问题仍然有些模糊。
WH_MOUSE_LL
。答案 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();
}