.net winapi postmessage
我知道这是个很流行的问题。无论如何 我想在其他进程的窗体上单击按钮,我无法通过spy++获得按钮的句柄,所以我将模拟鼠标单击。 我得到的是: 这是点的全局坐标,我要单击:.net winapi postmessage,winapi,Winapi,我知道这是个很流行的问题。无论如何 我想在其他进程的窗体上单击按钮,我无法通过spy++获得按钮的句柄,所以我将模拟鼠标单击。 我得到的是: 这是点的全局坐标,我要单击: doubleclickcoords = (MSLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(MSLLHOOKSTRUCT)); 之后,我得到表单的坐标,让它成为“mspaint”,并找到点的局部坐标,然后通过postmessage尝试发送“click”,但什么也没发生。
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#,winapi通过p/invoke如果您想自动化另一个应用程序,我建议您查看用于此特定目的的自动化API,而不是试图用post消息攻击Windows。大多数情况下,由于安全原因,通过不同进程发送的PostMessage都不起作用。在WindowsVista、7和UAC(用户帐户设置)中更是如此
这是一篇很好的文章。
如果只是针对一个小的实用程序而不是一个更大的应用程序的一部分,你可以考虑使用一个专门设计用来控制其他进程的脚本语言。它还能够生成独立的可执行文件