Я работаю с двумя различными программами, одна из которых написана на Java, и моя цель - управлять ими в тандеме с помощью сценария powershell, который я пытаюсь создать, который позволит мне восстанавливать из минимизированного состояния окна выбора из каждогоприложение, которое порождено родительским процессом.Я изучал использование программного обеспечения для автоматизации пользовательского интерфейса, такого как AutoIT, но из того, что я обнаружил, эти программы не могут легко получить доступ / идентифицировать окна / элементы управления в Java.Так что я обратился к Powershell / C #, чтобы достичь своей цели, а это означает идентификацию / доступ к окнам.Просто чтобы быть понятным, я пытаюсь захватить / идентифицировать окна, которые находятся на панели задач и отображаются с именованными описаниями в диспетчере задач, которые имеют отступ на один уровень от основного списка запущенных приложений на вкладке Процессы.Было бы достаточно иметь возможность управлять этими подокнами с помощью фильтра регулярных выражений, примененного к «имени» в диспетчере задач.Для этих двух программ диспетчер задач не отображает PID или «Имя процесса», и, несмотря на все мои поиски, я не смог найти ничего, что могло бы достичь этого, но отсутствие навыков программирования не помогает.Из моего поиска FindWindowEx не будет работать, поскольку он работает только с дочерними окнами, а окна, к которым я пытаюсь получить доступ, являются перекрывающимися окнами верхнего уровня.Ниже приведен один из подходов, которые я пробовал из Получить дескрипторы окон приложения , но я явно ошибаюсь, пытаясь выполнить его в Powershell:
Add-Type -TypeDefinition $Source -Language CSharp
$Source = @"
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool EnumChildWindows(IntPtr hwndParent, EnumWindowsProc lpEnumFunc, IntPtr lParam);
private List<IntPtr> GetChildWindows(IntPtr parent)
{
List<IntPtr> result = new List<IntPtr>();
GCHandle listHandle = GCHandle.Alloc(result);
try
{
EnumWindowProc childProc = new EnumWindowProc(EnumWindow);
EnumChildWindows(parent, childProc, GCHandle.ToIntPtr(listHandle));
}
finally
{
if (listHandle.IsAllocated)
listHandle.Free();
}
return result;
"@
New-Object -TypeName GetChildWindowHandle(Title)
I 'мы также безуспешно пытались использовать этот код из Получить дескрипторы окна приложения , используя следующее:
Add-Type -TypeDefinition $Source -Language CSharp
$Source = @"
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
IntPtr hWnd = (IntPtr)FindWindow(windowName, null);
struct SearchData
{
public string WindowText;
public IntPtr ParentHandle;
public IntPtr ResultHandle;
}
delegate bool EnumWindowsCallback(IntPtr currentWindowHandle, ref SearchData searchData);
[DllImport("user32.dll")] static extern bool EnumWindows(EnumWindowsCallback callback, ref SearchData searchData);
[DllImport("user32.dll")] static extern IntPtr GetParent(IntPtr childHandle);
[DllImport("user32.dll")] static extern void GetWindowText(IntPtr handle, StringBuilder resultWindowText, int maxTextCapacity);
static bool Callback(IntPtr currentWindowHandle, ref SearchData searchData)
{
bool continueEnumeration = true;
IntPtr currentWindowParentHandle = GetParent(currentWindowHandle);
if (currentWindowParentHandle == searchData.ParentHandle)
{
var windowText = new StringBuilder(1024);
GetWindowText(currentWindowHandle, windowText, windowText.Capacity);
if (windowText.ToString() == searchData.WindowText)
{
searchData.ResultHandle = currentWindowHandle;
continueEnumeration = false;
}
}
return continueEnumeration;
}
IntPtr GetChildWindowHandle(string windowText, IntPtr parentHandle)
{
var searchData = new SearchData{ParentHandle=parentHandle, WindowText=windowText};
EnumWindows(Callback, ref searchData);
return searchData.ResultHandle;
}
"@
New-Object -TypeName FindWindow(Title)
Другие попытки, которые я предпринял, используют MainWindowHandle, но не помогают мне, так как мне нужно манипулироватьокна дочерних процессов, а также AppActivate Wscript.shell, который, опять же, не дает мне доступ к отдельным дочерним окнам и, кроме того, кажется ненадежным.Я понимаю, что этот вопрос может сводиться к тому, как использовать код C # в PowerShell, но я не уверен и не знаю, нахожусь ли я на правильном пути к достижению своей цели под названием.У меня заканчиваются идеи о том, как поступить, поэтому я благодарен за любую помощь, которую кто-либо может оказать.