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

时间:2011-05-25 04:41:43

标签: c# controls location mouseclick-event

我尝试使用以下按钮点击按钮:

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, IntPtr.Zero, IntPtr.Zero);
SendMessage(sendButton, WM_LBUTTONUP, IntPtr.Zero, IntPtr.Zero);

以上所有都无法点击按钮,所以我想知道我有其他替代品,或者是否可以从它的处理程序获取按钮位置X和Y

建议,想法会非常好。

2 个答案:

答案 0 :(得分:1)

如果按钮有热键(Alt + ...),您可以使用发送有关按键盘键的消息:

//Presses virtual key in active window.
void PressVK(UINT vk)
{
    //Down Alt.
    keybd_event(VK_MENU, MapVirtualKey(VK_MENU, 0), 0, 0);
    //Press key.
    keybd_event(vk, MapVirtualKey(vk, 0), 0, 0);
    keybd_event(vk, MapVirtualKey(vk, 0), KEYEVENTF_KEYUP, 0);
    //Up Alt.
    keybd_event(VK_MENU, MapVirtualKey(VK_MENU, 0), KEYEVENTF_KEYUP, 0);
}

这是一个C ++代码。但是您可以将所有功能导入C#并使用它们。您需要的所有内容:激活目标窗口并使用正确的密钥作为参数调用此函数。

如果您有按钮处理,请拨打GetWindowRect。它将返回一个指向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.
}

答案 1 :(得分:1)

在使用sendmessage进行了多次测试之后,我已经解决了尝试使用PostMessage的问题......这就像魅力......

PostMessage(mainControlChild, WM_KEYDOWN, (int)Keys.Return, 0);
PostMessage(mainControlChild, WM_KEYUP, (int)Keys.Return, 0);

解决了我的问题并将其发送到后台。