2013-08-20 2 views
1

Мне нужно управлять независимым приложением с помощью хост-приложения WinForms, как если бы другое приложение выполнялось на удаленном рабочем столе, а мое недавно созданное хост-приложение было хостом удаленного рабочего стола. Статья CodeProject Remote Desktop using C#.NET вдохновляет на то, что вероятность того, что моя задача возможна, не равна нулю. В нем объясняется, как использовать «Библиотека типов управления терминалами Microsoft» или MSTSCLib.dll.Возможно ли запустить независимое приложение в приложении WinForms?

Однако, я не хочу подключаться к удаленному рабочему столу. Во всяком случае, я хочу подключиться ко второму рабочему столу на том же компьютере, если это необходимо для самостоятельного запуска размещенного приложения или чего-то подобного. Возможно ли это с MSTSCLib? Если да, то какие аспекты мне нужно, чтобы посмотреть на дальнейшее развитие дизайна для этого?

ВАЖНОЕ ЗАМЕЧАНИЕ: Ограничение на отсутствие доступа к коду внешней программы больше не существует. Программы «гостя» будут только из ряда специально определенных программ.

+3

Вы имеете в виду, что хотите встроить свой интерфейс в свою? С их сотрудничеством это не просто. (и он полностью не связан с TS, вам нужны методы Windows API для повторных окон) – SLaks

+2

короткий ответ нет, длинный ответ, все возможно ... – Jodrell

+0

@Slaks: Именно поэтому ProfK хочет «быть клиентом TS на локальном хосте» вместо reparenting windows: Потому что TS * может * быть сделано без сотрудничества с «размещенным» пользовательским интерфейсом (и обычно есть). – Medinoc

ответ

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 Является ли путь программы, который используется для использования в вашем приложении

Hop e Эта помощь! :)

Смежные вопросы