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!
}
}