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
编辑:
我根本不在乎控制台。我的目标是获取鼠标点击坐标(屏幕中的任何位置)。这意味着首先我会从控制台启动程序,然后在屏幕上点击。控制台应该立即打印出鼠标点击的坐标。
这是我对您需要做的事情的看法,尽管我对是否理解这个问题还有点模糊。
- 创建一个普通控制台应用程序
- 安装鼠标挂钩
WH_MOUSE_LL
- 随意处理挂钩中的鼠标消息,例如在控制台上输出信息
用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();
}