2013-06-20 3 views
0

Мне удалось открыть родительскую форму MDI в родительской форме MDi, используя следующий метод: Я сделал два настольных приложения (то есть App1 и App2), имеющих родительские формы MDI в качестве запуска. В App1 я добавил панель родителя MDI, в которой мы собираемся открыть другое приложение, то есть App2. Теперь я добавил этот код в App1.Родитель MDI в другой родительской форме MDI

using System.Diagnostics; 
using System.Runtime.InteropServices; 

и

[DllImport("user32.dll")] 
    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); 

Теперь в случае нажатия кнопки используется следующий код. (App1)

// Create a new process 
     Process proc; 

     // Start the process 
     proc = Process.Start(Application.StartupPath + @"\App2.exe"); 
     ////proc = Process.Start("notepad.exe"); 
     proc.WaitForInputIdle(); 

     // Set the panel control as the application's parent 
     SetParent(proc.MainWindowHandle, this.panel1.Handle); 

     // Maximize application 
     SendMessage(proc.MainWindowHandle, 274, 61488, 0); 
     MessageBox.Show(Application.OpenForms[0].ToString()); 

Здесь Application.StartupPath + @ "\ App2.exe" - это процесс или EXE-файл, который я создал (вы знаете, как построить решение). Во-первых, код отлично работает при отладке с точкой останова, но когда я пытаюсь запустить его, App2 открывается как другой процесс, но не в App1. Во-вторых, я не могу открыть форму, которую я добавил в App2, которая открывается как дочерняя форма MDI (app2).

Form1 frm = new Form1(); 
     frm.MdiParent = Application.OpenForms[0]; 
     frm.Show(); 

Вот как я открываю детские формы в формах MDI.

+0

Это поддерживается SetParent(), поскольку это возможно в Windows версии 3. Версия Windows, которая еще не имеет процессов и потоков. Шансы, которые все еще идут на хороший конец, обратно пропорциональны вашей программе, действующей как программа Windows 3.x. Спустя 20 лет эти шансы становятся низкими. Полное отсутствие проверки ошибок в противном случае затрудняет диагностику проблем. Использование SetLastError = true и бросание Win32Exception, когда функция winapi возвращает код сбоя. –

+0

Итак, какие изменения я должен сделать (bcoz я не мог понять ваш комментарий в целом)? Во-вторых, я попытался открыть файл notepad.exe тем же методом. Это сработало. – DhavalR

+0

@hans Passnat: Я изменил свой код на http://stackoverflow.com/questions/10102526/c-sharp-mainwindowhandle-always-zero, и я в состоянии, что хочу. Но мне все еще интересно узнать о вашем комментарии (просто для знания.). – DhavalR

ответ

0
// Create a new process 
Process proc; 

// Start the process 
proc = Process.Start(Application.StartupPath + @"\App2.exe"); 
proc.WaitForInputIdle(); 

// Add this by using using System.Threading; 
Thread.Sleep(500); 

// Set the panel control as the application's parent 
SetParent(proc.MainWindowHandle, this.panel1.Handle); 
Смежные вопросы