【发布时间】:2015-09-30 23:03:52
【问题描述】:
我是 WINAPI 的新手,并且已经知道如何将消息发送到另一个程序。我正在使用的程序但是我希望能够让它点击一个特定的按钮。从我通过查看 Spy++ 窗口了解到的情况来看,每次重新加载程序时,程序的句柄都会发生变化,控件的句柄也是如此。控制 ID 保持不变。经过两天的尝试,我来到了这里。
在 SendMesssageA 下,如果我将当前句柄指定为 Spy++ 可以查看并使用它并运行代码,它可以正常工作并单击我的外部应用程序上的按钮。我正在尝试使用 GetDlgItem,因为我已经读到我可以使用它来获取控件(子窗口)的句柄。但是,我做错了什么,因为无论我做什么,它都会返回 0 或“null”。
如何让 GetDlgItem 返回子控件句柄,以便我可以使用它发送消息以在外部应用程序中单击该控件?
感谢您提前提供的帮助。
[DllImport("User32.dll")]
static extern bool SetForegroundWindow(IntPtr hWnd);
Process[] myProcess = Process.GetProcessesByName("program name here");
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern int SendMessageA(IntPtr hwnd, int wMsg, int wParam, uint lParam);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr GetDlgItem(int hwnd, int childID);
public const int WM_LBUTTONDOWN = 0x0201;
public const int WM_LBUTTONUP = 0x0202;
public void SendClick()
{
IntPtr hwnd = myProcess[0].MainWindowHandle;
SetForegroundWindow(hwnd);
int intCID = 1389;
IntPtr ptrTest = GetDlgItem(hwnd, intCID);
SendKeys.SendWait(" ");
Thread.Sleep(1000);
SendKeys.SendWait("various text to be sent here");
Thread.Sleep(1000);
SendKeys.SendWait("{ENTER}");
Thread.Sleep(1000);
SendMessageA(ptrTest, WM_LBUTTONDOWN, WM_LBUTTONDOWN, 0);
}
【问题讨论】:
-
对于任何登陆这里的人,因为他们只想使用其控制 ID 获取 HWND:是的,
GetDlgItem是答案,它应该可以工作。它甚至可以跨进程边界工作,except 如果所需的 HWND 属于 64 位进程。我不确定,但也许那是 OP 的问题。