如何在我的应用程序中创建一个不可见的窗口

时间:2018-04-12 09:11:15

标签: c# browser web-applications invisible

我想在我的Web应用程序中创建一代不可见的浏览器窗口。 我知道要在不可见的窗口中打开一个新的Internet Explorer实例,我们可以使用PowerShell执行以下命令:

public void MakeReport(int jobId, int jobType)
        {
            var intent = Android.App.Application.Context.PackageManager.GetLaunchIntentForPackage(AppBundle);
            if (intent is null)
                throw new NullReferenceException();

            // Set Data
            intent.PutExtra(UsernameMessage, javaUsername);
            intent.PutExtra(PasswordMessage, javaPassword);
            intent.PutExtra(JobIdMessage, jobId);
            intent.PutExtra(JobTypeMessage, jobType);

// Test All OK
            string usernameTest = intent.GetStringExtra("USER_NAME_FROM_MDO_SCHEDULE");
            string passwordTest = intent.GetStringExtra("USER_PASSWORD_FROM_MDO_SCHEDULE");
            int jobIdTest = intent.GetIntExtra("JOB_ID_FROM_MDO_SCHEDULE", -1);
            int jobTypeTest = intent.GetIntExtra("JOB_TYPE_FROM_MDO_SCHEDULE", 0);

            Forms.Context.StartActivity(intent);
        }

        #endregion

如何在我的应用程序中使用此脚本? 我正在使用C#和javascript编写应用程序。如何在C#中实现上述脚本? 你能帮我解决这个问题吗?提前谢谢你。

1 个答案:

答案 0 :(得分:0)

您应该按照以下方式进行:

$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);

编辑2 找到另一种隐藏窗口的方法(如果上面的方法不起作用 在MSDN上,我找到了ShowWindow函数。我现在没有办法尝试,但你可以通过以下方式实现:

您需要ShowWindow& FindWindow

ShowWindows函数中,tehre是两个对您的用例有效的值。 定义:

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

HWND - 窗口的句柄。

mCmdShow(int):

  

SW_HIDE 0隐藏窗口并激活另一个窗口。   SW_SHOW 5激活窗口并以当前大小和位置显示它。

FindWindow

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

参数

     

lpClassName [in,optional]

     

类型:LPCTSTR

     

由前一次调用RegisterClass或RegisterClassEx函数创建的类名或类原子。原子必须在   lpClassName的低位字;高阶词必须为零。

     

如果lpClassName指向一个字符串,它指定窗口类名。类名可以是RegisterClass或注册的任何名称   RegisterClassEx,或任何预定义的控件类名称。

     

如果lpClassName为NULL,则会找到标题与之匹配的任何窗口   lpWindowName参数。

     

lpWindowName [in,optional]

     

类型:LPCTSTR

     

窗口名称(窗口标题)。如果此参数为NULL,则所有窗口名称都匹配。

这可能是你能得到的最低价。 (源代码受technet solution启发) 使用系统; 使用System.Diagnostics; 使用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 
        }
    }

}