2015-03-19 4 views
0

Когда я открываю внешнее приложение как MDI Child, приложение открывается, но не как дочерний MDI. У меня есть класс, который работает notepad.exe правильно, но он не работает с моим собственным приложением:Почему я не могу открыть внешнее приложение как MDI?

public class ExternalApp { 
    [System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)] 
    private static extern uint SetParent(IntPtr hWndChild, IntPtr hWndNewParent); 
    public static void LoadProcessInControl(string app_path, Control parent) { 
     System.Diagnostics.Process p = System.Diagnostics.Process.Start(app_path); 
     p.WaitForInputIdle(); 
     ExternalApp.SetParent(p.MainWindowHandle, parent.Handle); 
    } 
} 

я вызываю функцию с этим:

ExternalApp.LoadProcessInControl(@"C:\Users\Bálint\Documents\Visual Studio 2013\Projects\TesztApp\TesztApp.exe", this); 

В чем проблема?

+1

Проблема заключается в том, что окно блокнота не правильный стиль (это не дочернее окно MDI, это окно верхнего уровня). Вы не можете заставить окно быть чем-то не таким, как вы можете заставить вашу золотую рыбу стать пакетом, просто привязывая большие и тяжелые пакеты к его спине. –

+0

@ mbalint987 Я в основном имею то же, что и вы, с Notepad.exe, поскольку приложение загружает его, и блокнот отображается как ребенок - отлично, но у меня есть другое приложение, которое я создал (не блокнот или calc), а просто загружает как обычно, но не как ребенок - вы решили это? – harag

ответ

2

На самом деле я ошибся в своем комментарии, эти свойства не нужно устанавливать. Прошло много времени. :) Для того, чтобы сделать это, я имел некоторый успех, используя панель в виде ребенка:

public partial class Form2 : Form 
{ 
    [DllImport("user32.dll", SetLastError = true)] 
    private static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent); 
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] 
    static extern IntPtr SendMessage(IntPtr hWnd, Int32 Msg, Int32 wParam, Int32 lParam); 
    public Form2() 
    { 
     InitializeComponent(); 
     Process process = new Process(); 
     process.StartInfo.FileName = "Notepad.exe"; 
     process.Start(); 
     process.WaitForInputIdle(); 
     SetParent(process.MainWindowHandle, panel1.Handle); 
     //This maximizes the process window. 
     SendMessage(process.MainWindowHandle, 274, 61488, 0); 
     return; 
    } 
} 

Документация SendMessage является here. Форма ребенка показано, как это, с Notepad внедренный:

public Form1() 
{ 
    InitializeComponent(); 
    Form2 newForm2 = new Form2(); 
    newForm2.MdiParent = this; 
    newForm2.Show(); 
} 
+0

Как вы можете получить эти параметры? 274, 61488, 0 – mbalint987

+1

@ mbalint987 - Я добавил ссылку на страницу документации для SendMessage. – tinstaafl