Откройте каталог в File Explorer из консоли и верните фокус обратно в консоль. - PullRequest
1 голос
/ 15 января 2020

Используя следующий код, я могу открыть папку в Проводнике в Windows 10:

require('child_process').exec('start "" "c:\\test"');

Это хорошо работает. Однако основное внимание уделяется недавно открытому окну. Я использую это из сценария узла и запрашиваю ввод от пользователя после того, как окно было открыто. Это раздражает пользователей, так как им приходится вручную щелкать внутри окна консоли, чтобы ответить на запрос ввода.

Есть ли способ изменить указанную выше команду так, чтобы она не фокусировалась на открытом окне в первое место. Или заставить фокус вернуться в окно консоли?

1 Ответ

0 голосов
/ 15 января 2020

Примечание:

  • Этот ответ должен работать даже с Git Bash.

  • Поскольку код включает создание процесса PowerShell и код, который включает в себя компиляцию по требованию кода C#, решение медленное .

  • Окно проводника файлов кратко получает фокус, но ранее активное окно активируется сразу.

  • Хотя метод .ShellExcecute() COM-объекта Shell.Application сделает решение более простым и быстрым, его способность запускать процесс без активации окна, к сожалению, не работать с explorer.exe.

require('child_process').execFile(
  'powershell.exe', 
  [ 
    '-NoProfile',
    '-Command', 
    `
    $type = Add-Type -PassThru -Namespace Util -Name WinApi -MemberDefinition '[DllImport("user32.dll")] public static extern bool SetForegroundWindow(IntPtr hWnd); [DllImport("user32.dll")] public static extern IntPtr GetForegroundWindow();'
    # Get the current foreground window.
    $hwndBefore = $type::GetForegroundWindow()
    # Open the target folder in File Explorer
    Start-Process 'c:\\temp'
    # Wait for a different window - assumed to be the File Explorer window - to become active.
    while ($hwndBefore -eq $type::GetForegroundWindow()) { Start-Sleep -Milliseconds 200 }
    Start-Sleep -Milliseconds 200
    # Put focus back on the previous foreground window.
    $null = $type::SetForegroundWindow($hwndBefore)
    `
  ]
 );

Примечание. Я использовал шаблонный литерал ES6 (`...`) выше, для удобства определения многострочных строк с ним; концептуально, вышесказанное является дословной строкой. Остерегайтесь конструкций PowerShell, таких как ${var} внутри литерала шаблона, потому что они будут интерпретироваться как JavaScript выражений для расширения вперед.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...