【问题标题】:How to perform a Virtual Mouse click C# without using a mouse [duplicate]如何在不使用鼠标的情况下执行虚拟鼠标单击 C# [重复]
【发布时间】:2013-02-15 06:40:10
【问题描述】:

我想在 Windows 应用程序中执行单击,而不使用真正的鼠标(这样我可以将其最小化)。很像机器人的行为。

我该怎么做?

【问题讨论】:

  • 你有什么理由不能只在代码中最小化?
  • 如果您提供有关所需内容的更多信息,您可能会得到更好的答案。 “不使用真正的鼠标”可能意味着用户不必亲自抓住鼠标......
  • 当您将鼠标悬停在此问题旁边的向上箭头上时,您看到它的内容了吗? “这个问题显示了研究工作;它有用且清晰”。这些标准都不符合,这个问题怎么有 3 票让我很困惑。
  • @Steve,对我来说似乎并不难理解;用最简单的话来说,我相当肯定他想要“嘿,ApplicationX,我刚刚在 x200,y400 处点击了你” - 虽然 ApplicationX 实际上已被最小化,但真正的鼠标指针不受影响
  • @user2047975 我的回答是否可以接受?如果是这样,请接受作为答案。如果没有,请告诉我我可以做些什么来为您澄清或改进它。

标签: c# click mouse virtual


【解决方案1】:

我想你要找的函数是PostMessage

[DllImport("user32.dll", SetLastError = true)]
public static extern bool PostMessage(int hWnd, uint Msg, int wParam, int lParam);

您可以阅读更多关于它的信息here on codeproject,并下载一个发送击键的演示项目。

此方法根据您使用的进程句柄 (hWnd) 直接在与程序关联的输入队列上发布消息

你也可以使用这个函数来发送鼠标点击,通过发布按钮事件,像这样:

PostMessage(hWnd, WM_LBUTTONDBLCLK, 0, l);

更多关于这些按钮事件的信息可以在here on MSDN找到。

我敢肯定,如果您在 Internet 上搜索 PostMessage 鼠标事件的示例,您会发现很多

【讨论】:

  • 这个最接近真实答案。但是,您需要使用 SendMessage 来可靠地确保使用 DirectInput 的应用程序对消息进行正确排序。
  • 链接到“文章”具有误导性。我会嘲笑这个笑话,但在 SO 上有帖子声称它不能用 PostMessage(hWnd, WM_LBUTTONDBLCLK, ?, ?) 完成。你试过并确认它有效吗?
  • @EmperorOrionii 链接似乎已损坏或更改为其他内容。我已将其从我的答案中删除。但是是的,我之前使用过 SendMessage 和 PostMessage 将击键或鼠标事件发送到应用程序中。
【解决方案2】:

您可以使用计时器,或处理按键,并在计时器滴答或按键功能中创建模拟鼠标点击,使用 user32.dll 文件(最好是表单形状,以便您可以处理计时器间隔.. .):

using System;
using System.Windows.Forms;
namespace Clicker
{
    public partial class Form1 : Form
    {
    [System.Runtime.InteropServices.DllImport("user32.dll")]
    public static extern void mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);

    private const int MOUSEEVENT_LEFTDOWN = 0x02;
    private const int MOUSEEVENT_LEFTUP = 0x04;
    private const int MOUSEEVENT_MIDDLEDOWN = 0x20;
    private const int MOUSEEVENT_MIDDLEUP = 0x40;
    private const int MOUSEEVENT_RIGHTDOWN = 0x08;
    private const int MOUSEEVENT_RIGHTUP = 0x10;

    private int count = 0;

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        timer1.Start();
        label2.Text = "Timer is on";
    }

    private void button2_Click(object sender, EventArgs e)
    {
        timer1.Stop();
        label2.Text = "Timer is off";
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        mouse_event(MOUSEEVENT_LEFTDOWN, 0, 0, 0, 0);
        mouse_event(MOUSEEVENT_LEFTUP, 0, 0, 0, 0);
        count++;
        label3.Text = count + " amount of clicks";
    }

}

}

【讨论】:

  • 对于关键事件实现GetAsyncKeyState(Int32 key)
  • 来自 user32.dll 文件
  • 如果要检查按键是否被按下,请尝试
  • if(GetAsyncKeyState(keyCode) == 15){}
  • 当keyCode是key的ASCII值时。
【解决方案3】:
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern void mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);    
public const int MOUSEEVENTF_LEFTDOWN = 0x02;
public const int MOUSEEVENTF_LEFTUP = 0x04;
public const int MOUSEEVENTF_RIGHTDOWN = 0x08;
public const int MOUSEEVENTF_RIGHTUP = 0x10;

public void MouseClick()
{
   int x = 100;
   int y = 100;
   mouse_event(MOUSEEVENTF_LEFTDOWN, x, y, 0, 0);
   mouse_event(MOUSEEVENTF_LEFTUP, x, y, 0, 0);
}

我在http://social.msdn.microsoft.com/forums/en-US/winforms/thread/86dcf918-0e48-40c2-88ae-0a09797db1ab/ 找到了这个。

【讨论】:

  • 这其实是用真鼠标
  • 通过虚拟鼠标点击我假设他的意思是,例如“MouseClick("Internet Explorer", 100, 400); 它将向 IE 发送点击,即使它保持最小化。
  • 这个不使用实体鼠标;根据提交者的说法,它“通过调用 mouse_event API 模拟鼠标点击”,而不是实际使用鼠标。
  • 我认为您应该将他的问题解释为“在 Windows 应用程序中单击,而不使用真正的鼠标,所以我可以[在窗口最小化时向它发送单击]” - 就像机器人在最小化窗口内点击一样。
【解决方案4】:

您需要它所在机器的分辨率,使用 System.Windows.Forms.Screen 类,此处:SO

然后您需要将鼠标移动到该位置,或者避免该位置,您可能需要挂钩到正在运行的程序,并向其发送一个使其最小化的事件。

很难让这样的东西与 C# 一起使用,因为您需要将该 DLL 注入程序中。像 C 这样的低级语言可能会有所帮助。

Here's a brief explanation / question

【讨论】:

    【解决方案5】:

    您可以使用窗口自动化在窗口中找到最小化按钮并执行单击。我发现它很容易并且经常使用。这是了解整个概念的链接。 https://msdn.microsoft.com/en-us/library/windows/desktop/ff486375(v=vs.85).aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      • 2011-01-25
      相关资源
      最近更新 更多