我知道这是一个很流行的问题。不管怎么说。我想在其他进程的窗体上点击按钮,我不能通过spy++获得按钮的句柄,所以我将模拟鼠标点击。我得到的是:
这是点的全局坐标,我想单击:
doubleclickcoords = (MSLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(MSLLHOOKSTRUCT));
在那之后,我得到了表单的坐标,让它是"mspaint",并找到点的本地坐标,并通过postmessage尝试发送"click",但什么也没有发生。我错过了什么??:
public static void SendDoubleMouseClick()
{
IntPtr iHandle = GetWnd("mspaint");
Rectangle myRect = new Rectangle();
RECT rct;
if (!GetWindowRect(iHandle, out rct))
{
MessageBox.Show("ERROR");
}
else
{
myRect.X = rct.Left;
myRect.Y = rct.Top;
myRect.Width = rct.Right - rct.Left;
myRect.Height = rct.Bottom - rct.Top;
}
PostMessage(iHandle, 0x0201, 0, new IntPtr((doubleclickcoords.pt.y - myRect.Y) * 0x10000 + (doubleclickcoords.pt.x - myRect.X)));
PostMessage(iHandle, 0x0202, 0, new IntPtr((doubleclickcoords.pt.y - myRect.Y) * 0x10000 + (doubleclickcoords.pt.x - myRect.X)));
}
编辑:语言为c#,通过p/invoke调用winapi
发布于 2010-11-25 19:13:28
如果你想自动化另一个应用程序,我建议你看一下自动化API,它是为这个特定目的而设计的,而不是试图用post消息来攻击Windows。大多数情况下,出于安全原因,通过不同进程的PostMessage将不起作用。这在Windows Vista、7和UAC (用户帐户设置)中更是如此。
这是一篇很好的文章,http://msdn.microsoft.com/en-us/magazine/cc163465.aspx。
发布于 2010-11-25 20:18:19
如果它只是一个小实用程序,而不是大型应用程序的一部分,您可以考虑使用AutoIt -一种专门设计用于控制其他进程的脚本语言。它还能够生成独立的可执行文件。
https://stackoverflow.com/questions/4276251
复制相似问题