C# FindWindowEx несколько WindowText

Сейчас я занимаюсь разработкой автоматической программы, которая будет нажимать на кнопки других программ. Но теперь у меня проблема с тем, что программа, которой я должен управлять, имеет разные языки. Сейчас я нахожу решение, которое позволяет моей программе нажимать правую кнопку независимо от языка. Вот мой текущий код:

IntPtr Parent = Win32.FindWindowEx(Database.hWnd[botnum], IntPtr.Zero, null, "GUI");
    IntPtr Dock = Win32.FindWindowEx(Parent, IntPtr.Zero, null, "Dock"); 
    //Here might need many other languages support
    //The button text will change after clicking it and I don't want to click it while its text is changed
    if (Dock != IntPtr.Zero)
    {
         Win32.PostMessage(Dock, 0x0201, 1, IntPtr.Zero);
         Win32.PostMessage(Dock, 0x0202, 0, IntPtr.Zero);
         await Task.Delay(5000);
    }

Я попробовал найти все дочерние обработчики и выбрать 9-е IntPtr (кнопка 9-го)

 IntPtr Dock = GetAllChildrenWindowHandles(Parent, 9)[8];

    static List<IntPtr> GetAllChildrenWindowHandles(IntPtr hParent, int maxCount)
    {
        List<IntPtr> result = new List<IntPtr>();
        int ct = 0;
        IntPtr prevChild = IntPtr.Zero;
        IntPtr currChild = IntPtr.Zero;
        while (true && ct < maxCount)
        {
            currChild = Win32.FindWindowEx(hParent, prevChild, null, null);
            if (currChild == IntPtr.Zero) break;
            result.Add(currChild);
            prevChild = currChild;
            ++ct;
        }
        return result;
    }

Но так как мне нужно нажать кнопку, когда текст кнопки отображается в Dock (или на другом языке), и текст кнопки изменится на Undock (или на другом языке) после нажатия, поэтому использование GetAllChildren также невозможно использовать.

Любые предложения, чтобы сделать это? Я думаю об этом коде, но он не увенчался успехом.

IntPtr Dock = FindWindowEx(Parent,IntPtr.Zero,null,"Dock"|"Bashkim"|"слияние"|"合并"|"Merger"|"
Fusie"|"合併"//And Many Others);

1 ответ

Неважно, ток нашел способ исправить это. Я оставлю здесь ответ, если кому-то понадобится в будущем.

if (checkbox1.Checked == true)
{
       IntPtr Parent = Win32.FindWindowEx(Database.hWnd[botnum], IntPtr.Zero, null, "GUI");
       IntPtr Undock = Win32.FindWindowEx(Parent, IntPtr.Zero, null, "Undock");
       //Find Undock Button
       if (Undock == IntPtr.Zero)
       {
            IntPtr Dock = GetAllChildrenWindowHandles(Parent, 9)[8];
            //If Undock is not visible, then the button is not clicked!
            //ChildrenWindow 9th is the button that I need to click!
            if (Dock != IntPtr.Zero) //Dock button found
            {
                Win32.PostMessage(Dock, 0x0201, 1, IntPtr.Zero);
                Win32.PostMessage(Dock, 0x0202, 0, IntPtr.Zero);
                Win32.SendMessage(Dock, 0x000C, 0, "Undock");
                //Hence, Click the button and set the text to 'Undock' whatever the language is to make it visible that the button had been clicked!
            }
        }
        Undock = IntPtr.Zero;
        Win32.ShowWindow(Database.hWnd[botnum], 0);
     }
     else // If user had cancel docking
     {
         IntPtr Buttons = Win32.FindWindowEx(Database.hWnd[botnum], IntPtr.Zero, null, "GUI");
        IntPtr Dock = Win32.FindWindowEx(Buttons, IntPtr.Zero, null, "Undock");
        //Find the Undock button to click!
        if (Dock != IntPtr.Zero)
        {
              Win32.PostMessage(Dock, 0x0201, 1, IntPtr.Zero);
              Win32.PostMessage(Dock, 0x0202, 0, IntPtr.Zero);
              Thread.Sleep(1000);
        //It will change back Undock to the text that is original!
        //So there is no need to SendMessage to change the text again!
        }
}
Другие вопросы по тегам