mouse_event与真实鼠标事件
本文关键字:鼠标 事件 真实 event mouse | 更新日期: 2023-09-27 18:09:30
- 真正的鼠标点击(手动(和执行代码中的点击(通过c#中的mouse_event(之间有区别吗
- 同样,真正移动鼠标光标和设置cursor.Position之间有区别吗
如果有差异:
- 如何识别该事件的来源
- 有一种方法可以模拟鼠标点击/光标移动,就好像它来自鼠标或键盘驱动程序一样
第1版:为@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);
}
}
如果创建了正确的Event参数,则没有区别。从"机器"中找出事件的唯一方法是分析时刻。
@Garath,MSLLHOOKSTRUCT包含LLMHF_INJECTED
标志,当事件来自对mouse_event
函数的调用时设置该标志。
正如我在这里所解释的,您可以通过使用SetWindowsHookEx
来检索这些信息。
对控件的实际单击和对鼠标事件处理程序的编程调用之间的区别应该是sender
参数。
对于真正的鼠标单击,您将收到作为发件人单击的控件。当您以编程方式调用事件处理程序时,您应该提供一个明智的发送方
我也在C#中尝试这样做,但在注入的C#dll中,托管的clr中。我的一个朋友建议读这篇文章http://pastebin.com/rj4YcW4C
我试过mouse_event、PostMessage、SendMessage、SendInput和Cursor.Position。所有这些都被忽略了,但我相信这篇文章有我们共同寻求的答案。