1
  1. 真正的鼠标单击(手动)和从代码执行单击(通过c# 中的mouse_event )之间有区别吗?
  2. 同样,真正移动鼠标光标和设置Cursor.Position有区别吗?

如果有区别:

  1. 如何识别该事件的来源?
  2. 有一种方法可以模拟鼠标单击/光标移动,就好像它来自鼠标或键盘驱动程序一样?

Edit1:为@Marco Forberg 添加了代码示例。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    [System.Runtime.InteropServices.DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto, CallingConvention = System.Runtime.InteropServices.CallingConvention.StdCall)]
    public static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint cButtons, uint dwExtraInfo);

    Button button;

    private void Form1_Load(object sender, EventArgs e)
    {

        button = new Button();
        button.Text = "Click";
        button.Location = new Point(50, 50);
        button.Size = new System.Drawing.Size(100, 20);
        button.Click += button_Click;
        Controls.Add(button);

        Button simulate = new Button();
        simulate.Text = "Simulate";
        simulate.Location = new Point(50, 100);
        simulate.Size = new System.Drawing.Size(100, 20);
        simulate.Click += simulate_Click;
        Controls.Add(simulate);

    }

    void button_Click(object sender, EventArgs e)
    {
        Console.WriteLine(sender);
    }

    void simulate_Click(object sender, EventArgs e)
    {
        Point location = button.PointToScreen(Point.Empty);
        Cursor.Position = new Point(location.X + (button.Width / 2), location.Y + (button.Height / 2));

        mouse_event(0x02 | 0x04, 0, 0, 0, 0);
    }
}
4

4 回答 4

3

@Garath, MSLLHOOKSTRUCT包含一个LLMHF_INJECTED标志,当事件来自mouse_event函数调用时设置。

您可以使用SetWindowsHookEx在此处解释的方法检索此信息。

于 2014-10-10T15:01:43.287 回答
3

如果您创建正确的事件参数,则没有区别。找出事件来自“机器”的唯一方法是分析时刻。

于 2013-04-16T08:41:01.723 回答
0

我也在尝试在 C# 中执行此操作,但在注入的 c# dll 中,托管 clr。我的一个朋友建议阅读这篇文章http://pastebin.com/rj4YcW4C

我试过 mouse_event、PostMessage、SendMessage、SendInput 和 Cursor.Position。所有人都被忽略了,但我相信那篇文章有我们都在寻求的答案。

于 2013-04-22T08:39:32.767 回答
0

真正单击控件和以编程方式调用鼠标事件处理程序之间的区别应该是sender参数。

对于真正的鼠标点击,您会收到作为发送者点击的控件。当您以编程方式调用事件处理程序时,您应该提供一个合理的发送者

于 2013-04-16T08:43:41.183 回答