繁体   English   中英

如何使用c#获取第三方应用程序按钮的句柄?

[英]How to get the handle of 3rd party application's button using c#?

我正在尝试在第三方应用程序中生成单击事件。 首先,我尝试模拟计算器中的点击。 这是代码“

IntPtr hwnd = IntPtr.Zero;
IntPtr hwndChild = IntPtr.Zero;
//Get a handle for the Calculator Application main window
hwnd = FindWindow(null, "Calculator");

hwndChild = FindWindowEx(hwnd, IntPtr.Zero, "Button", "1");

//send BN_CLICKED message
SendMessage(hwndChild, BM_CLICK, IntPtr.Zero, IntPtr.Zero);

但是使用这个代码我没有得到按钮的句柄。 请有人帮忙吗。 有没有其他方法来模拟第三方应用程序上的按钮单击?

谢谢。

您的一般方法是正确的,但您的代码有两个潜在的问题:

  1. FindWindowEx仅查找指定窗口的直接子FindWindowEx 计算器按钮可能布置在容器窗口中,该容器窗口是主窗口的子窗口,因此该按钮不是主窗口的直接子窗口。

  2. BM_CLICK的文档说它通过发送鼠标向下和向上消息来模拟点击,因此您可能必须在发送此消息之前激活父窗口。

当我更换时,它开始工作

public const uint BM_CLICK = 0x00F5;

public const uint WM_LBUTTONDOWN = 0x0201; 
public const uint WM_LBUTTONUP = 0x0202;

和使用

SendMessage(buttonHandle, WM_LBUTTONDOWN, IntPtr.Zero, IntPtr.Zero); 
SendMessage(buttonHandle, WM_LBUTTONUP, IntPtr.Zero, IntPtr.Zero);

首先使用SPY ++来查找具有Handle的按钮。

在某些情况下,看起来像Button的控件可以是图形控件。 不同的是图形控件不会有Handle,但是Windows控件会有句柄。 如果该控件具有有效的Handle。然后使用FindWindowEx

也给父窗口句柄(我想第一个参数,可能你必须使用标题使用GetWindow())

然后发送单击消息。

如果您没有按钮的句柄,则可以模拟鼠标在坐标上的单击:

class User32
 { 
    [Flags]
    public enum MouseEventFlags
    {
        LEFTDOWN = 0x00000002,
        LEFTUP = 0x00000004,
        MIDDLEDOWN = 0x00000020,
        MIDDLEUP = 0x00000040,
        MOVE = 0x00000001,
        ABSOLUTE = 0x00008000,
        RIGHTDOWN = 0x00000008,
        RIGHTUP = 0x00000010
    }

    [DllImport("user32.dll")]
    public static extern bool SetCursorPos(int X, int Y);

    [DllImport("user32.dll")]
    public static extern void mouse_event(uint dwFlags, 
                                   uint dx, 
                                   uint dy, 
                                   uint dwData,
                                   int dwExtraInfo);

    [DllImport("user32.dll")]
    public static extern void mouse_event(uint dwFlags, 
                                   uint dx, 
                                   uint dy, 
                                   uint dwData,
                                   UIntPtr dwExtraInfo);
}

class Program
{
     static void Main()
     {
         User32.SetCursorPos(25, 153);
         User32.mouse_event((uint)User32.MouseEventFlags.LEFTDOWN, 25, 153, 0, 0);
         User32.mouse_event((uint)User32.MouseEventFlags.LEFTUP, 25, 153, 0, 0);
     }
}

但是,函数SetCursorPos将光标位置设置在屏幕的全局坐标中,因此请务必获得第三方应用程序窗口的位置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM