【问题标题】:How to minimize the remote desktop connection (RDC) window through C#?如何通过 C# 最小化远程桌面连接 (RDC) 窗口?
【发布时间】:2019-07-18 12:44:56
【问题描述】:

下面这段代码让我通过mstsc.exe与电脑机器建立远程桌面连接。

 string ipAddress = "XXX.XX.XXX.XXX" // IP Address of other machine
 System.Diagnostics.Process proc = new System.Diagnostics.Process();
 proc.StartInfo.UseShellExecute = true;
 proc.StartInfo.FileName = "mstsc.exe";
 proc.StartInfo.Arguments = "/v:" + ipAddress ;    
 proc.Start();

我想在 RDC 窗口(镜像窗口)成功启动后将其最小化。有什么办法可以通过 C# 来实现吗?

这是我尝试过的,但没有任何区别:

proc.StartInfo.CreateNoWindow = true;
proc.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;

任何帮助将不胜感激。

【问题讨论】:

    标签: c# .net process rdp mstsc


    【解决方案1】:

    您可以使用user32.dll 中的ShowWindow 函数。将以下导入添加到您的程序中。您需要引用using System.Runtime.InteropServices;

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
    

    启动 RDP 所需的内容将照常运行,但随后您需要获取在远程桌面打开后创建的新 mstsc 进程。您启动的原始进程在proc.Start() 之后退出。使用下面的代码将为您提供第一个 mstsc 进程。注意:如果您打开了多个 RDP 窗口,您应该选择比只选择第一个更好的选择。

    Process process = Process.GetProcessesByName("mstsc").First();
    

    然后用SW_MINIMIZE = 6调用ShowWindow方法如下图所示

    ShowWindow(process.MainWindowHandle, SW_MINIMIZE);
    

    完整的解决方案变成:

    private const int SW_MAXIMIZE = 3;
    private const int SW_MINIMIZE = 6;
    
    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
    
    static void Main(string[] args) {
        string ipAddress = "xxx.xxx.xxx.xxx";
        Process proc = new Process();
        proc.StartInfo.UseShellExecute = true;
        proc.StartInfo.FileName = "mstsc.exe";
        proc.StartInfo.Arguments = "/v:" + ipAddress ;    
        proc.Start();
    
        // NOTE: add some kind of delay to wait for the new process to be created.
    
        Process process = Process.GetProcessesByName("mstsc").First();
    
        ShowWindow(process.MainWindowHandle, SW_MINIMIZE);
    }
    

    注意:@Sergio 的回答会起作用,但它将最小化创建的初始进程。如果您需要输入凭据,我认为这不是正确的方法。

    Reference for ShowWindow function

    【讨论】:

    • 我尝试了您的解决方案,但仍然无法最小化 RDP 镜像窗口。
    • @user42067 RDP 镜像窗口是什么意思?您是否添加了一些东西以在创建新流程所需的时间内适当延迟?
    • 启动并让用户看到计算机的窗口。我的意思是顶部有三个符号(网络符号、锁定、pin/unpin)和计算机名称的窗口。我想通过 C# 最小化那个窗口。
    • @user42067 在proc.Start(); 的结尾和下一行之间,您是否等待了足够的时间。请参阅我关于需要等待新进程创建的说明
    • @user42067 当然可以,在我的环境中,Thread.Sleep(10000); 就足够了。我没有指定等待答案的方法,因为我对您的申请了解不够。另一种方法是监视mstsc 进程的数量并等待创建一个新进程。这将是 IMO 最干净的解决方案,但这取决于您的实施
    【解决方案2】:

    使用windows风格,这行得通。

        string ipAddress = "xxx.xx.xxx.xxx"; // IP Address of other machine
        ProcessStartInfo p = new ProcessStartInfo("mstsc.exe");
        p.UseShellExecute = true;
        p.Arguments = "/v:" + ipAddress;
        p.WindowStyle = ProcessWindowStyle.Minimized;
        Process.Start(p);
    

    【讨论】:

    • 进程开始最小化,然后工作并响应您的要求,如果您没有保存的凭据,您将打开一个窗口,要求您输入它们,在这种情况下,您是对@ivcubr。无论如何,我就是不明白你为什么给试图帮助你的人打负分。
    • 抱歉投反对票,请编辑您的答案,以便我投赞成票。不过你的回答对我没用。但是感谢您的帮助。
    猜你喜欢
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    • 2011-11-30
    • 2013-05-04
    • 1970-01-01
    • 1970-01-01
    • 2015-08-24
    • 2012-09-27
    相关资源
    最近更新 更多