Я хочу, чтобы Out-GridView закрывался через определенное время, например, через 10 секунд.
Не привык к Windows PowerShell.
Любой ответ помогает.
на самом деле мне нужно только знать, как закрыть выходную сетку с помощью команды, поэтому мне не нужно нажимать кнопку x.
Позвольте мне дать вам стандартный совет для новичков: если ответ решает вашу проблему, примите его, щелкнув большую галочку (✓) рядом с ним и, при желании, проголосуйте за него (для голосования требуется не менее 15 очков репутации ). Если вы нашли другие ответы полезными, проголосуйте за них. Принятие (за которое вы получите 2 очка репутации) и голосование поможет будущим читателям. См. соответствующая статья справочного центра. Если возможно, примите также один из ответов на свой предыдущий вопрос.





К сожалению, PowerShell изначально не предлагает поиск и закрытие произвольных окон графического интерфейса пользователя, но вы можете использовать командлет Add-Type с специально скомпилированным кодом C#, который, в свою очередь, использует объявления P / Invoke для доступа к Windows API.
Ниже приведен рабочий пример:
Он определяет отдельный заголовок окна, который будет использоваться для вызова Out-GridView, чтобы окно можно было (надеюсь) однозначно найти позже по его заголовку; также предполагается, что существует только окно один с этим заголовком.
Он создает фоновое задание, которое использует Add-Member для определения статического вспомогательного класса с методом закрытия окна по его заголовку и вызывает его после заданного тайм-аута.
Он вызывает Out-GridViewсинхронно (блокирование) с -Wait, используя указанный заголовок окна. Если окно остается открытым в течение указанного периода ожидания, фоновое задание автоматически закрывает его.
Он удаляет фоновое задание после закрытия окна.
Примечание. Если вам не нужно, чтобы вызов Out-GridView был синхронным, вам не обязательно понадобится фоновое задание.
# Define a distinct window title that you expect no other window to have.
$title = 'Close Me'
# Start a background job that closes the window after a specified timeout.
$job = Start-Job {
param($timeout, $title)
# Define a helper class that uses the Windows API to find and close windows.
Add-Type -Namespace same2u.net -Name WinUtil -MemberDefinition @'
// P/Invoke declarations for access to the Windows API.
[DllImport("user32.dll", SetLastError=true)]
private static extern IntPtr FindWindow(string lpszClass, string lpszWindow);
[DllImport("user32.dll", SetLastError=true)]
private static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
const UInt32 WM_CLOSE = 0x0010;
// Returns the hWnd (window handle) of the first window that matches the
// specified title and, optionally, window class.
// If none is found, IntPtr.Zero is returned, which can you test for with -eq 0
public static IntPtr GetWindowHandle(string title, string className = null) {
// As a courtesy, we interpet '' as null, because passing null from
// PowerShell requires the non-obvious [nullstring]::value.
if (className == "") { className = null; }
return FindWindow(className, title);
}
// Closes the first window that matches the specified title and, optionally,
// window class. Returns true if a windows found and succesfully closed.
public static bool CloseWindow(string title, string className = null) {
bool ok = false;
// As a courtesy, we interpet '' as null, because passing null from
// PowerShell requires the non-obvious [nullstring]::value.
if (className == "") { className = null; }
IntPtr hwnd = FindWindow(className, title);
if (hwnd != IntPtr.Zero) {
SendMessage(hwnd, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
// !! SendMessage seemingly always returns 0. To determine success,
// !! we simply test if the window still exists.
ok = IntPtr.Zero == FindWindow(className, title);
}
return ok;
}
'@
Start-Sleep $timeout
$null = [same2u.net.WinUtil]::CloseWindow($title)
} -ArgumentList 3, $title
# Open an Out-GridView window synchronously.
# If you leave it open, the background job will close it after 3 seconds.
1..10 | Out-GridView -Title $title -Wait
# Remove the background job; -Force is needed in case the job hasn't finished yet
# (if you've closed the window manually before the timeout).
Remove-Job -Force $job
Придется поиграться с этим, выглядит шикарно!
Почему? Какую проблему вы на самом деле пытаетесь решить, когда вам нужно, чтобы
Out-GridViewзакрылся по таймеру? Могут быть лучшие решения для того, что вы пытаетесь сделать ...