Как создать невидимое окно в моем приложении

Я хочу создать поколение невидимого окна браузера в своем веб-приложении. Я знаю, что чтобы открыть новый экземпляр Internet Explorer в невидимом окне, мы можем сделать это с помощью следующих команд PowerShell:

$ie = New-Object -COMObject InternetExplorer.Application

$ie.Navigate2("www.microsoft.com")

$ie.Visible = $False

Как я могу использовать этот скрипт в своем приложении? Я пишу приложение на C # и javascript. Как я могу реализовать приведенный выше сценарий на C #? Не могли бы вы мне помочь? заранее спасибо.


person Community    schedule 12.04.2018    source источник


Ответы (1)


Делать это нужно следующим образом:

$iexplorer = new-object -com "InternetExplorer.Application"
$iexplorer.navigate("https://www.microsoft.com")

По умолчанию он создает невидимое окно.

Если вам нужно сделать его видимым, вы измените логическое значение:

$iexplorer.visible = $true

Чтобы снова сделать его невидимым, просто выполните:

$iexplorer.visible = $false

Редактировать Невидимое начало C # - я почти уверен, что вы найдете его на SO. Следующего кода должно быть достаточно:

ProcessStartInfo ieProcess = new ProcessStartInfo();
ieProcess.FileName = "iexplore.exe";
ieProcess.Arguments = "https://www.microsoft.com";
ieProcess.CreateNoWindow = true;
ieProcess.WindowStyle = ProcessWindowStyle.Hidden;
ieProcess.ErrorDialog = false;
Process.Start(ieProcess);

Edit 2 нашел другой способ скрыть окно (если вышеуказанное не работает В MSDN я нашел ShowWindow. У меня нет возможности попробовать ее сейчас, но вы можете сделать это следующим образом:

Вам понадобится ShowWindow & _ 6_.

В функции ShowWindows есть два значения, подходящих для вашего варианта использования. Определение:

BOOL WINAPI ShowWindow(
  _In_ HWND hWnd,
  _In_ int  nCmdShow
);

HWND - ручка на окно.

mCmdShow (число):

SW_HIDE 0 Скрывает окно и активирует другое окно. SW_SHOW 5 Активирует окно и отображает его в текущем размере и положении.

Для FindWindow:

HWND WINAPI FindWindow(
  _In_opt_ LPCTSTR lpClassName,
  _In_opt_ LPCTSTR lpWindowName
);

Параметры

lpClassName [in, необязательно]

Тип: LPCTSTR

Имя класса или атом класса, созданный предыдущим вызовом функции RegisterClass или RegisterClassEx. Атом должен быть в младшем слове lpClassName; старшее слово должно быть нулевым.

Если lpClassName указывает на строку, она определяет имя класса окна. Имя класса может быть любым именем, зарегистрированным с помощью RegisterClass или RegisterClassEx, или любым из предопределенных имен управляющих классов.

Если lpClassName имеет значение NULL, он находит любое окно, заголовок которого соответствует параметру lpWindowName.

lpWindowName [in, необязательно]

Тип: LPCTSTR

Имя окна (заголовок окна). Если этот параметр равен NULL, все имена окон совпадают.

Это, вероятно, самый низкий уровень, который вы можете получить. (исходный код вдохновлен техническое решение) using System; с помощью System.Diagnostics; using System.Runtime.InteropServices;

class Program
{
    [DllImport("user32.dll")]
    static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

    [DllImport("user32.dll")]
    static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

    // meaning defined above
    const int SW_HIDE = 0;
    const int SW_SHOW = 5;

    static void Main()
    {
        Process ieProcess= new Process();
        ieProcess.StartInfo.FileName = "iexplore.exe";
        ieProcess.StartInfo.Arguments = "https://www.microsoft.com";
        ieProcess.StartInfo.UseShellExecute = false;
        ieProcess.StartInfo.CreateNoWindow = true;
        ieProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
        ieProcess.StartInfo.LoadUserProfile = true;
        ieProcess.Start();

        //IntPtr hWnd = FindWindow(windowName, null);
        IntPtr hWnd = FindWindow("Internet Explorer", null)
        if (hWnd != IntPtr.Zero)
        {
            ShowWindow(hWnd, SW_HIDE); // Hide console window
            ieProcess.WaitForExit(); // Tells you if the stdout or stderro should be synchronous or asynchronous 
        }
    }

}
person tukan    schedule 12.04.2018
comment
как это можно сделать на C #? Спасибо - person ; 12.04.2018
comment
@homeostasis конечно, писать не буду, так как уже писали. Проверьте SO - stackoverflow.com/questions/1431115/. Один линдер по ссылке System.Diagnostics.Process.Start("iexplore", "http://www.microsoft.com"); - person tukan; 12.04.2018
comment
Почему ваш вопрос отмечен тегом powershell? - person tukan; 12.04.2018
comment
хорошо, System.Diagnostics.Process.Start("iexplore", "http://www.microsoft.com"); но сделать это невидимым? - person ; 12.04.2018
comment
если вы хотите сделать его невидимым, вы должны определить его по-другому, я отредактирую сообщение. - person tukan; 12.04.2018
comment
@tunkan, На самом деле, я пробовал что-то очень похожее на ваш ответ, и все же обе реализации давали один и тот же результат - открытие экземпляра Internet Explorer. - person ; 12.04.2018
comment
@homeostasis Я вижу, вы должны были упомянуть в посте. Я проверю MSDN. Думаю, есть еще одна функция, позволяющая скрыть окно. - person tukan; 12.04.2018
comment
Буду очень признателен, если вы поможете, спасибо - person ; 12.04.2018
comment
спасибо за ответ, где мне разместить функции ShowWindow и FindWindow, чтобы они работали? - person ; 12.04.2018
comment
@homeostasis вы видели исходный код? Ты понимаешь это? Это полное определение класса с static void Main(). Его следует определять как есть. - person tukan; 12.04.2018
comment
он не скрывает окно IE, поэтому я спросил - person ; 12.04.2018
comment
@homeostasis Понятно. Вы пробовали без ieProcess.WaitForExit();? Или, может быть, windowName не Internet Explorer, вам нужно это проверить. - person tukan; 12.04.2018
comment
@ одна проблема заключалась в том, что windowName для IE - IEFrame, но все же окно видно - person ; 12.04.2018
comment
@homeostasis Хм, это всего лишь вкладка (фрейм), которую вам нужно будет пронумеровать по всем фреймам. Вы уверены, что у вас есть ручка? Если вы попробуете if (hWnd == IntPtr.Zero) {MessageBox.Show("no IE instance"); return; }, он перейдет в это? - person tukan; 12.04.2018
comment
@homeostasis ИЛИ проще найти по заголовку страницы, например. для Microsoft.com - IntPtr hWnd = FindWindow(null, "Microsoft - Official Home Page - Internet Explorer"). Однако будет меняться в зависимости от вашего местоположения. - person tukan; 12.04.2018
comment
Фактически, значение hWnd не равно 0 каждый раз, когда я помещаю if to catch, если оно равно нулю. Проблема в том, что функция скрытия не работает должным образом - person ; 12.04.2018
comment
@homeostasis хорошо, тогда я бы сделал это следующим образом: сначала проверьте, работает ли он в простом приложении, таком как блокнот. Если он работает, то у вас есть какое-то исключение, и вы можете поиграть с ним, если он не работает даже для блокнота, значит, в коде есть ошибка. На мой взгляд, наименьшее усилие - это запустить сценарий PowerShell из кода C #. - person tukan; 12.04.2018