为啥我的模拟鼠标点击没有做任何事情?
Posted
技术标签:
【中文标题】为啥我的模拟鼠标点击没有做任何事情?【英文标题】:Why isn't my simulated mouse click doing anything?为什么我的模拟鼠标点击没有做任何事情? 【发布时间】:2012-02-21 21:37:29 【问题描述】:我有这个代码:
[DllImport("user32.dll")]
static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint dwData, UIntPtr dwExtraInfo);
[Flags]
public enum MouseEventFlags
Move = 0x0001,
LeftDown = 0x0002,
LeftUp = 0x0004,
RightDown = 0x0008,
RightUp = 0x0010,
MiddleDown = 0x0020,
MiddleUp = 0x0040,
Absolute = 0x8000
public void SimMouseEvent(MouseEventFlags e, int x, int y)
mouse_event((uint)e, (uint)x, (uint)y, 0, UIntPtr.Zero);
public void SimLeftClick(int x, int y)
SimMouseEvent(MouseEventFlags.LeftUp | MouseEventFlags.RightUp, x, y);
我的表单如下所示:
当你点击“按钮”时,它会运行:
private void button3_Click(object sender, RoutedEventArgs e)
SimLeftClick(50, 50);
在我的窗口上我也有这个:
private void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
MessageBox.Show("click");
当我点击窗口时,它按预期显示“点击”,但当我点击“按钮”时,它似乎没有做任何事情。
坐标是绝对的还是相对的?多显示器怎么样?它们是否只适用于重点应用程序?
我希望 50,50 要么在某个地方点击我的窗口并触发“点击”处理程序,要么点击某个随机窗口,因为它完全错过了我的应用程序并专注于它......为什么没有任何事情发生?
【问题讨论】:
【参考方案1】:您处理鼠标按钮按下消息,但发送鼠标按钮按下消息。单击需要按下按钮,然后再按下相同的按钮。
坐标被忽略,因为您没有传递Move
标志。
尝试阅读the documentation。
【讨论】:
我看了看,但无法弄清楚。我想我把它作为 LeftDown|LeftUp 但后来在某个地方搞砸了。似乎现在可以工作了。谢谢! 公平地说,文档非常糟糕;它并没有说需要MOUSEEVENTF_MOVE
。
@Ian: "如果鼠标移动了,由设置的MOUSEEVENTF_MOVE
表示,dx
和 dy
保存关于那个动作。”
@BenVoigt: "dx [in] 类型:DWORD 鼠标沿 x 轴的绝对位置或其自上次鼠标事件生成以来的运动量,取决于 MOUSEEVENTF_ABSOLUTE 的设置。绝对数据被指定为鼠标的实际 x 坐标;相对数据被指定为移动的 mickey 的数量。一个 mickey 是鼠标必须移动的量才能报告它已经移动。"
@Ian:但主要是我假设 .NET 开发人员不了解 Win32 API 文档,并且可能从 pinvoke.net 或某个博客获取 p/invoke 签名。其中的信息比我链接的 MSDN 页面还要少。【参考方案2】:
根据 Ben 的建议已修复。
public void SimLeftClick(int x, int y)
var scr = Screen.PrimaryScreen.Bounds;
SimMouseEvent(MouseEventFlags.LeftDown | MouseEventFlags.LeftUp | MouseEventFlags.Move | MouseEventFlags.Absolute,
(int)(x / (double)scr.Width * 65535),
(int)(y / (double)scr.Height * 65535));
【讨论】:
以上是关于为啥我的模拟鼠标点击没有做任何事情?的主要内容,如果未能解决你的问题,请参考以下文章