1

我需要使用 WinForms 主机应用程序控制一个独立的应用程序,就好像另一个应用程序在远程桌面上运行一样,而我新开发的主机应用程序是远程桌面主机。CodeProject 文章Remote Desktop using C#.NET鼓舞人心,我的任务是可能的可能性不是零。它解释了如何使用“Microsoft 终端服务控件类型库”,或MSTSCLib.dll执行此操作。

但是,我不想连接到远程桌面。如果有的话,如果需要独立运行托管应用程序或类似的东西,我想连接到同一台机器上的第二个桌面。这完全有可能MSTSCLib吗?如果是这样,我需要考虑哪些方面来进一步开发设计?

重要提示:不再存在无法访问外部程序代码的约束。“来宾”节目将仅来自一系列特别定义的节目。

4

1 回答 1

1

我的一个朋友以前有时做过这项工作!

你应该这样做:

首先导入系统 DLL:

    [DllImport("user32.dll")]
    static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

    [DllImport("user32.dll", EntryPoint = "SetWindowLongA", SetLastError = true)]
    private static extern long SetWindowLong(IntPtr hwnd, int nIndex, long dwNewLong);

    [DllImport("user32.dll", SetLastError = true)]
    private static extern bool MoveWindow(IntPtr hwnd, int x, int y, int cx, int cy, bool repaint);

现在声明一个计时器并遵循以下代码:

    private const int GWL_STYLE = (-16);
    private const int WS_VISIBLE = 0x10000000;
    Process p;
 /*Closing Is Timer*/
        private void Closing_Tick(object sender, EventArgs e)
    {


            p.Refresh();
            string a = p.ProcessName;              
                SetParent(p.MainWindowHandle, panel1.Handle);
                SetWindowLong(p.MainWindowHandle, GWL_STYLE, WS_VISIBLE);
              MoveWindow(p.MainWindowHandle, 0, 0, this.Width, this.Height, true);


    }
  void run(string add)
    {
        string addres = add;

        try
        {
            p = Process.Start(addres);
            Thread.Sleep(500); // Allow the process to open it's window
            SetParent(p.MainWindowHandle, panel1.Handle);
            SetWindowLong(p.MainWindowHandle, GWL_STYLE, WS_VISIBLE);
            MoveWindow(p.MainWindowHandle, 0, 0, this.Width, this.Height, true);


        }
        catch
        {
            Closeing.Enabled = false;
            MessageBox.Show(addres + "\n" + "Not Found", "Error",
          MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1, MessageBoxOptions.RtlReading);
            Environment.Exit(0);

        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Closeing.Enabled = true;
        run(@textBox1.Text); 
    }

Run Method 的输入参数是要在您的应用程序中运行的程序的路径

希望这有帮助!:)

于 2013-08-21T16:21:57.973 回答