如何使用其控件ID获取子窗口?

时间:2010-09-26 03:31:43

标签: c# winapi

我是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);
    }

1 个答案:

答案 0 :(得分:1)

我认为您必须使用Win32 API查找“接收”应用程序窗口,然后找到该句柄的子窗口。 这是我发现谷歌搜索Win32 API FindWindow

http://www.c-sharpcorner.com/UploadFile/shrijeetnair/win32api12062005005528AM/win32api.aspx