Как разместить VB6 EXE в C# winform
Я запрограммировал WinForm в .net с помощью C#, чтобы открыть VB6 exe в TabControl,
теперь все окна exe файл как Notpad.exe или ... открывает успех в TabControl, но VB6 не открывается правильно в WinForm,он не подчиняется родительскому / дочернему закону.
Теперь, пожалуйста, помогите мне, это очень важно и несекретно для меня.
В Дополнение:
1-в программе используется класс Procces для запуска программы, а также используется SetParent() для определения Parent/Child legal.
2 - я использовал из Telerik просмотров страницы открывать окна в разных вкладках.
код:
// Global Var --------------- public string TabName; public const int GWL_STYLE = -16; public const uint WS_VISIBLE = 0x10000000; // --------------------------- private void radButtonElement3_Click(object sender, EventArgs e) { //Creeate New Tab in Telerik PageView TabName = radButtonElement3.Text; Telerik.WinControls.UI.RadPageViewPage Tab = new Telerik.WinControls.UI.RadPageViewPage(TabName); radPageView1.Pages.Add(Tab); radPageView1.SelectedPage = Tab; IntPtr appWin; appWin = IntPtr.Zero; string exeName = Application.StartupPath + "\\" + "VB6.exe"; Process p = null; try { // Start the process p = System.Diagnostics.Process.Start(exeName); // Wait for process to be created and enter idle condition p.WaitForInputIdle(); // Get the main handle appWin = p.MainWindowHandle; } catch (Exception ex) { MessageBox.Show(this, ex.Message, "Error"); } //set new Handel IntPtr _newHandler = radPageView1.Pages[(radPageView1.Pages.Count) - 1].Handle; SetParent(p.MainWindowHandle, _newHandler); SetWindowLong(_newHandler, GWL_STYLE, WS_VISIBLE); MoveWindow(_newHandler, 0, 0, radPageView1.Pages[0].Size.Width, radPageView1.Pages[0].Size.Height, true); } // define user32.dll --------------------------------------- [DllImport("user32.dll", EntryPoint = "GetWindowThreadProcessId", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] private static extern long GetWindowThreadProcessId(long hWnd, long lpdwProcessId); [DllImport("user32.dll", SetLastError = true)] private static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("User32.dll")] public static extern int GetClassLong(IntPtr hWnd, int index); [DllImport("user32.dll", SetLastError = true)] private static extern long SetParent(IntPtr hWndChild, IntPtr hWndNewParent); [DllImport("user32.dll", EntryPoint = "GetWindowLongA", SetLastError = true)] private static extern long GetWindowLong(IntPtr hwnd, int nIndex); [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 long SetWindowPos(IntPtr hwnd, long hWndInsertAfter, long x, long y, long cx, long cy, long wFlags); [DllImport("user32.dll", SetLastError = true)] private static extern bool MoveWindow(IntPtr hwnd, int x, int y, int cx, int cy, bool repaint); [DllImport("user32.dll", EntryPoint = "PostMessageA", SetLastError = true)] private static extern bool PostMessage(IntPtr hwnd, uint Msg, long wParam, long lParam);
Philippe Mori
Пожалуйста, используйте кодовый блок для вашего кода. Никто не любит читать неформатированный код.
vahid211
танки для вашего внимания
0x01AA
Я несколько раз сталкивался с подобными проблемами. Не спрашивайте меня почему, но поставьте Thread.Sleep(200)
_после_ p.WaitForInputIdle()
решал ее каждый раз. Я знаю, это не очень хорошее решение... и да, я предполагаю, что вы проверили с помощью отладчика p.MainWindowHandle действителен...
vahid211
привет
Я это сделал, но проблема не разрешилась.
другое решение?
0x01AA
Нет, извините, другой идеи нет. Но я нашел кое-что в вашем коде... вы используете _newHandler....который я думаю, должен быть p. MainWindowHandle:
SetWindowLong(_newHandler, GWL_STYLE, WS_VISIBLE);
MoveWindow(_newHandler, 0, 0, radPageView1.Страницы[0].Размер.Ширина, radPageView1.Страницы[0].Размер.Высота, правда);