Окно браузера переднего плана - PullRequest
0 голосов
/ 21 июня 2019

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

Единственная проблема заключается в том, что я не могунайдите способ вывести окно Chrome на передний план.Код работает с простыми вещами, такими как Блокнот, но он просто не может найти Chrome, независимо от того, сколько вариантов имени я пытался вставить.

Я просматривал Интернет и не смогнайти решение этой проблемы.

Мой текущий код:

Add-Type @"
using System;
using System.Runtime.InteropServices;
public class Tricks {
    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool SetForegroundWindow(IntPtr hWnd);
}
"@
sleep -sec 2
$h = (Get-Process Chrome).MainWindowHandle
[void] [Tricks]::SetForegroundWindow($h)

Если я использую Get-Process Chrome, эта ошибка выдается:

Cannot convert argument "hWnd", with value: "System.Object[]", for
"SetForegroundWindow" to type "System.IntPtr": "Cannot convert the
"System.Object[]" value of type "System.Object[]" to type "System.IntPtr"."
At line:12 char:1
+ [void] [Tricks]::SetForegroundWindow($h)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodException
    + FullyQualifiedErrorId : MethodArgumentConversionInvalidCastArgument

Если я использую любойеще, эта ошибка выдается:

Get-Process : Cannot find a process with the name "Google Chrome". Verify the
process name and call the cmdlet again.
At line:11 char:7
+ $h = (Get-Process "Google Chrome").MainWindowHandle
+       ~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (Google Chrome:String) [Get-Process], ProcessCommandException
    + FullyQualifiedErrorId : NoProcessFoundForGivenName,Microsoft.PowerShell.Commands.GetProcessCommand

вместе с предыдущей ошибкой.

Однако, если я использую что-то вроде «Блокнота», ошибка не выдается, и программа работает, как ожидалось.

РЕДАКТИРОВАТЬ:

Мне даже удалось найти сокращенную версию сценария:

(New-Object -ComObject WScript.Shell).AppActivate((get-process Notepad).MainWindowTitle)

Однако, как и раньше, этоработает с чем-то вроде Блокнота, но в тот момент, когда я пытаюсь использовать Chrome, я получаю следующее:

Type mismatch. (Exception from HRESULT: 0x80020005 (DISP_E_TYPEMISMATCH))
At line:1 char:1
+ (New-Object -ComObject WScript.Shell).AppActivate((get-process Chrome ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (:) [], COMException
    + FullyQualifiedErrorId : System.Runtime.InteropServices.COMException

То же самое относится и к Firefox.

1 Ответ

0 голосов
/ 21 июня 2019

У меня нет Chrome, но с Firefox (вы сказали, что это то же самое)

PS C:\Users\peter> Get-Process firefox

Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
-------  ------    -----      -----     ------     --  -- -----------
    503      46   101704     131672      48.55  11500   1 firefox
    906      61    36184      65604       0.72  25312   1 firefox
    907      74    74264     122448       9.81  35828   1 firefox
   1730     116   172892     241800      36.11  36044   1 firefox
    697      59    73552     126796      15.77  39864   1 firefox
    520      33    20632      45052       0.25  41996   1 firefox


PS C:\Users\peter> Get-Process notepad

Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
-------  ------    -----      -----     ------     --  -- -----------
    230      13     2812      14044       0.09  50796   1 notepad

то есть существует несколько процессов Firefox.

К сожалению, мне не понятно, каквыберите «правильный».Попробуйте это:

 Get-Process firefox | %{ (New-Object -ComObject WScript.Shell).AppActivate($_.MainWindowTitle)}

, который просто пытается вывести все процессы на передний план.Это сработало для меня, но неэффективно - я уверен, что вы могли бы улучшить.

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