c # как искать в дочернем окне кнопку и нажимать на нее программно

#c#

#c#

Вопрос:

Я хотел бы знать, как я могу активировать кнопку программно с помощью библиотеки dll user32. Спасибо за помощь.

В следующем коде я получаю дескриптор над своим конкретным окном. Теперь я хотел бы активировать кнопку, которая есть в этом окне (кнопка Открыть).

Есть ли способ, которым я могу выполнить поиск и распечатать все, что обработчик видит в окне (кнопка открыть, закрыть … и так далее)?

Нужна помощь!!

Вот мой код:

 StringBuilder bld = new StringBuilder(256);
  StringBuilder className = new StringBuilder(256);
        GetWindowText(hwnd, bld, 256);
        GetClassName(hwnd, className, 256);  
        string text = bld.ToString();
        if (text.Length > 0)
        {
            Console.WriteLine("Pointer: "   hwnd.ToInt32().ToString()   " Window Title: "   text);
            if (text == "my_window") { 
                Console.WriteLine(bld.ToString() "..." className.ToString() "..." hwnd.ToString());

                System.IntPtr ptrChild = GetWindow(hwnd,5);
                IntPtr handll = FindWindow(className.ToString(), "my_window");
                if (handll == IntPtr.Zero)
                {
                    Console.WriteLine("not working");
                }
                SetForegroundWindow(handll);

               while (!handll.Equals(IntPtr.Zero)){ //HOW TO CHECK (FIND) FOR THE OK BUTTON?!}
..}
  

Ответ №1:

Вы можете выполнить поиск по всем элементам управления с помощью FindWindowEx.

 IntPtr handle = FindWindowEx(parentWindow, IntPtr.Zero, null, null);
while(handle != IntPtr.Zero)
{
    GetWindowText(handle, bld, 255);
    MessageBox.Show(bld.ToString()); // writes out displayed text
    handle = FindWindowEx(parentWindow, handle, null, null);
}
  

При желании вы можете выполнять поиск только по кнопкам:

 IntPtr handle = FindWindowEx(parentWindow, IntPtr.Zero, "BUTTON", null);
while(handle != IntPtr.Zero)
{
    GetWindowText(handle, bld, 255);
    MessageBox.Show(bld.ToString()); // writes out displayed text
    handle = FindWindowEx(parentWindow, handle, "BUTTON", null);
}
  

Комментарии:

1. куда мне поместить кнопку поиска? Внутри while (!handll. Равно(IntPtr.Zero)) { ? спасибо.пожалуйста, помогите.

2. Моему FindWindowEx нужен intptr вместо «Button». Как я мог это изменить?

3. [DllImport(«user32.dll «, SetLastError = true)] общедоступный статический внешний идентификатор FindWindowEx (идентификатор скобки IntPtr, идентификатор дочернего элемента IntPtr, строковое имя_класса, заголовок окна IntPtr);

4. хорошо, спасибо, что я ее изменил, я добавил: if (ptrChild == FindWindowEx(hwnd, IntPtr.Zero, «КНОПКА», «Сохранить как»)) { SendMessage(ptrChild, WM_LBUTTONDOWN, 0, IntPtr.Zero); SendMessage(ptrChild, WM_LBUTTONUP, 0, IntPtr.Zero); SendMessage ( ptrChild, 0, 1, IntPtr.Zero);} НО я НЕ ВИЖУ НИКАКОГО РЕЗУЛЬТАТА. ПОЧЕМУ?

5. Достаточно было бы отправить сообщение (WM_CLICK). Я не знаю? Находит ли FindWindowEx какую-либо кнопку?