单击另一个应用程序中的按钮,模拟鼠标+坐标?

问题描述

| 我尝试使用以下方法单击按钮:
private const int BN_CLICK = 0xF5;
private const uint WM_LBUTTONDOWN = 0x0201;
private const uint WM_LBUTTONUP = 0x0202;
SendMessage(sendButton,BN_CLICK,IntPtr.Zero,IntPtr.Zero);
SendMessage(sendButton,WM_LBUTTONDOWN,WM_LBUTTONUP,IntPtr.Zero);
以上所有操作均无法单击按钮,因此我想知道我是否还有其他选择,或者是否有可能从其处理程序中获取按钮位置X和Y? 建议,想法真的很好。     

解决方法

如果按钮具有热键(Alt + ...),则可以使用有关按键盘键的发送消息:
//Presses virtual key in active window.
void PressVK(UINT vk)
{
    //Down Alt.
    keybd_event(VK_MENU,MapVirtualKey(VK_MENU,0),0);
    //Press key.
    keybd_event(vk,MapVirtualKey(vk,0);
    keybd_event(vk,KEYEVENTF_KEYUP,0);
    //Up Alt.
    keybd_event(VK_MENU,0);
}
这是C ++代码。但是您可以将所有这些功能导入C#并使用它们。您所需要的全部:激活目标窗口并使用正确的键作为参数调用此函数。 如果您有按钮的手柄,请致电call2ѭ。它将返回一个指向
RECT
结构的指针,该结构接收窗口左上角和右下角的屏幕坐标。因此,无论主窗口大小如何,您都可以执行点击仿真。
[DllImport(\"user32.dll\")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetWindowRect(HandleRef hWnd,out RECT lpRect);

[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
    public int Left;
    public int Top;
    public int Right;
    public int Bottom;
}
使用它:
RECT rect;
if (!GetWindowRect(new HandleRef(this,this.Handle),out rect))
{
    //Error.
}
    ,经过多次使用sendmessage的测试后,我解决了尝试PostMessage的问题,该消息就像一个魅力……
PostMessage(mainControlChild,WM_KEYDOWN,(int)Keys.Return,0);
PostMessage(mainControlChild,WM_KEYUP,0);
解决了我的问题,并将其发送到后台。