Powershell - закрыть Out-GridView через определенное время

Я хочу, чтобы Out-GridView закрывался через определенное время, например, через 10 секунд.

Не привык к Windows PowerShell.

Любой ответ помогает.

Почему? Какую проблему вы на самом деле пытаетесь решить, когда вам нужно, чтобы Out-GridView закрылся по таймеру? Могут быть лучшие решения для того, что вы пытаетесь сделать ...

notjustme 26.07.2018 17:25

на самом деле мне нужно только знать, как закрыть выходную сетку с помощью команды, поэтому мне не нужно нажимать кнопку x.

gitgudgithub 26.07.2018 18:03

Позвольте мне дать вам стандартный совет для новичков: если ответ решает вашу проблему, примите его, щелкнув большую галочку (✓) рядом с ним и, при желании, проголосуйте за него (для голосования требуется не менее 15 очков репутации ). Если вы нашли другие ответы полезными, проголосуйте за них. Принятие (за которое вы получите 2 очка репутации) и голосование поможет будущим читателям. См. соответствующая статья справочного центра. Если возможно, примите также один из ответов на свой предыдущий вопрос.

mklement0 27.07.2018 00:40
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
706
1

Ответы 1

К сожалению, 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

Придется поиграться с этим, выглядит шикарно!

notjustme 27.07.2018 09:21

Другие вопросы по теме