mouse_event vs真实鼠标事件

时间:2013-04-16 08:37:53

标签: c# mouseevent keyevent mouseclick-event cursor-position

  1. 真正的鼠标点击(手动)和执行点击代码(c#中的mouse_event)之间有区别吗?
  2. 同样,实际移动鼠标光标和设置Cursor.Position?
  3. 之间是否存在差异?

    如果存在差异:

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

    3. 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 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

@Garath, 当事件来自对LLMHF_INJECTED函数的调用时,MSLLHOOKSTRUCT包含mouse_event标志。

您可以按我解释here使用SetWindowsHookEx来检索此信息。

答案 2 :(得分:0)

控件的实际点击和鼠标事件处理程序的程序调用之间的区别应该是sender参数。

对于真正的鼠标点击,您会收到被点击为发件人的控件。当您以编程方式调用事件处理程序时,您应该提供明智的发件人

答案 3 :(得分:0)

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

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