如何使用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);
但是使用此代码,我没有得到按钮的手柄。有人可以帮忙吗?是否有其他方法模拟按钮单击第三方应用程序?
谢谢。
解决方案 2
我更换时开始工作
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);
其他提示
您的一般方法是正确的,但是您的代码有两个潜在的问题:
FindWindowEx
仅找到指定窗口的直接孩子。计算器按钮可能是在主窗口的孩子的容器窗口中布置的,因此该按钮不会是主窗口的直接子。文档
BM_CLICK
说它通过向下发送鼠标并向上发送消息来模拟单击,因此您可能必须在发送此消息之前激活父窗口。
首先使用间谍++查找带有句柄的按钮。
在某些情况下,看起来按钮的控件可以是图形控件。区别在于图形控件将没有句柄,但是Windows控件将具有句柄。如果该控件具有有效的句柄。然后使用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在屏幕的全局坐标中设置了光标位置,因此,拳头使您陷入了第三方应用程序窗口的可能性。
不隶属于 StackOverflow