Как получить дочернее окно, используя его контрольный идентификатор? - PullRequest
2 голосов
/ 26 сентября 2010

Я новичок в WINAPI и выяснил, как отправить сообщение в другую программу.Однако программа, которую я использую, я бы хотела, чтобы она нажимала на конкретную кнопку.Из того, что я узнал из просмотра Spy ++, дескрипторы окон меняются для программ каждый раз, когда они перезагружаются, как и дескрипторы для их элементов управления.Идентификатор элемента управления остается прежним.После двух дней попыток выяснить это я здесь.

в SendMesssageA, если я укажу текущий дескриптор как видимый для Spy ++, использую его и запускаю код, он работает нормально и нажимает кнопку на моем внешнем приложении.Я пытаюсь использовать GetDlgItem, поскольку я прочитал, что я могу получить дескриптор для элемента управления (дочернее окно), используя его.Однако я делаю что-то не так, поскольку независимо от того, что я делаю, он возвращает 0 или «ноль».

Как я могу заставить 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 Ответ

1 голос
/ 26 сентября 2010

Я думаю, что вы должны использовать Win32 API, чтобы найти «принимающее» окно приложения, а затем найти дочернее окно этого дескриптора.Это то, что я нашел в Google Win32 API FindWindow

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...