C# 在Winform中托管RemoteAPP会话

C# 在Winform中托管RemoteAPP会话,c#,winforms,rdp,remoteapp,C#,Winforms,Rdp,Remoteapp,继续回到这件事上,我无法理解。。。我正在为work创建一个应用程序,它将我们所有的工具编译成一个更易于使用的GUI。我们使用的其中一个工具是我们从第三方使用的,并通过RDWeb作为远程应用程序托管。现在我也有了常规的远程桌面访问,我可以通过我的Winform使用MSTSC访问桌面,这非常好用。我很好奇是否可以在MSTSC控件中加载RemoteAPP而不是整个桌面,这样我的用户就不会访问整个桌面。或者如果有任何其他方法仅在Winforms中托管RemoteAPP 我已经在上查看了MSDN文档,但是

继续回到这件事上,我无法理解。。。我正在为work创建一个应用程序,它将我们所有的工具编译成一个更易于使用的GUI。我们使用的其中一个工具是我们从第三方使用的,并通过RDWeb作为远程应用程序托管。现在我也有了常规的远程桌面访问,我可以通过我的Winform使用MSTSC访问桌面,这非常好用。我很好奇是否可以在MSTSC控件中加载RemoteAPP而不是整个桌面,这样我的用户就不会访问整个桌面。或者如果有任何其他方法仅在Winforms中托管RemoteAPP

我已经在上查看了MSDN文档,但是当我尝试以下操作时,它只是抛出一个异常并给出HRESULT E_失败异常

在OnConnected事件触发后,我还尝试使用
remoteprogram
,得到了相同的结果

try
{
    rdp.Server = "FFWIN2008R2DC.fflab123.net";
    rdp.Domain = "fflab123";
    rdp.UserName = "administrator";
    IMsTscNonScriptable secured = (IMsTscNonScriptable)rdp.GetOcx();
    secured.ClearTextPassword = "password123";
    rdp.OnConnected += rdp_OnConnected;
    rdp.RemoteProgram.RemoteProgramMode = true;
    rdp.RemoteProgram2.RemoteApplicationName = "Calculator";
    rdp.RemoteProgram2.RemoteApplicationProgram = @"C:\Windows\system32\calc.exe";

    rdp.Connect();
}
catch (Exception Ex)
{
    MessageBox.Show("Error Connecting", "Error connecting to remote desktop " + " Error:  " + Ex.Message, MessageBoxButtons.OK, MessageBoxIcon.Error);
}

也许我走错了路,或者根本不可能。我只想沿着正确的方向轻推一下,我不需要任何人来为我写这篇文章。

IMsRdpClient.RemoteProgram.RemoteProgramMode
仅对从
MsRdpClientNotSafeForScripting
类ID初始化的客户端有效。有关相应的CLSID,请参阅,或使用
AxMsRdpClientNotSafeForScripting
interop类

var rc = new AxMsRdpClient7NotSafeForScripting();
rc.Dock = DockStyle.Fill;
this.Controls.Add(rc);
rc.RemoteProgram.RemoteProgramMode = true;
// ServerStartProgram can only be called on an open session; wait for connected until calling
rc.OnConnected += (_1, _2) => { rc.RemoteProgram.ServerStartProgram(@"%SYSTEMROOT%\notepad.exe", "", "%SYSTEMROOT%", true, "", false); };
rc.Server = "server.name";
rc.UserName = "domain\\user";
// needed to allow password
rc.AdvancedSettings7.PublicMode = false;
rc.AdvancedSettings7.ClearTextPassword = "password";
// needed to allow dimensions other than the size of the control
rc.DesktopWidth = SystemInformation.VirtualScreen.Width;
rc.DesktopHeight = SystemInformation.VirtualScreen.Height;
rc.AdvancedSettings7.SmartSizing = true;

rc.Connect();

没有人知道这方面的消息?我想这也解释了为什么我也不明白。哈哈。谢谢你的回复!所以我部分成功地实现了这个。这让我向前迈出了一步,但我认为还没有完全做到。现在,当我尝试连接时,它至少与RemoteProgramMode true连接,我可以看到它登录,然后当它要加载记事本时,例如,它只是位于蓝色屏幕上,从未实际加载程序。我也没有桌面,只是一个蓝屏,就像它要加载应用程序一样,但仍然失败。有什么想法吗?@Nabbic,如果你不启动一个应用程序,或者如果你试图启动一个不允许或不存在的应用程序,你将只看到蓝色桌面。确保您正在打开程序。您可以使用任务管理器或目标服务器上运行的其他程序进行验证。此外,请确保您设置了
DesktopWidth
DesktopHeight
成员,或者您被限制为窗体上控件的大小。5分钟超时是指远程服务器上没有打开的应用程序。我也有同样的要求来实现类似的东西。这个答案几乎对我有用。唯一的区别是远程应用程序在WinForm之外打开。WinForm将打开空白窗口,但另一个窗口将打开远程应用程序。我希望它在Winform中打开,在那里我有ActiveX组件。上面的代码中缺少什么可以允许这种情况发生?