在面板 C# 中自动调整调用进程的大小

Autoresize called process within a panel C#

我有以下代码可以在 tabControl 面板中打开记事本,这在我启动最大化表单时有效。

this.WindowState = FormWindowState.Maximized

标签打开:

TabPage tp = new TabPage("notepad");

Panel tb = new Panel();
      tb.Dock = DockStyle.Fill;

tp.Controls.Add(tb);
myTab.TabPages.Add(tp);

问题是当我启动表格时没有最大化,打开记事本然后调整表格大小,发生以下情况(见图link)---记事本没有伸展。

After Opening Notepad within Panel the form is maximized

有什么建议吗?谢谢!

 [DllImport("user32.dll", SetLastError = true)]
 private static extern uint SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

 [DllImport("USER32.DLL")]
 public static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);

 [DllImport("USER32.DLL")]
 public static extern int GetWindowLong(IntPtr hWnd, int nIndex);

 private const int GWL_STYLE = (-16);

 public static int WS_BORDER = 0x00800000;   
 public static int WS_CAPTION = WS_BORDER;        


 public static void loadProcess()
 {

   Process p = Process.Start("Notepad");
   p.WaitForInputIdle();
   p.Refresh();

   int WS_VISIBLE = GetWindowLong(p.MainWindowHandle, GWL_STYLE);            
   SetWindowLong(p.MainWindowHandle, GWL_STYLE, (WS_VISIBLE & ~WS_CAPTION));
   SetParent(p.MainWindowHandle, panel1.Handle);
   ShowWindow(p, SW_SHOWMAXIMIZED);            

  }

  [DllImport("user32.dll")]
  private static extern
  bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);

  private const int SW_SHOWMAXIMIZED = 3;

  private static bool ShowWindow(Process _Process, int nCmdShow)
  {
     return ShowWindowAsync(_Process.MainWindowHandle, nCmdShow);
  }

经过几次尝试,我能够自动调整它的大小。

在我的 loadProcess 方法中,我已将过程存储在哈希表中以供稍后参考。

Process p = Process.Start("Notepad");
p.WaitForInputIdle();
sessions.Add(tabName, p);

在 tabControl1_Selecting 事件上:

 String name = myProcess.SelectedTab.Name;

 Process pHandle = (Process) sessions[name];

 SetForegroundWindow(pHandle.MainWindowHandle);

 SetFocus(pHandle.MainWindowHandle);

 MoveWindow(pHandle.MainWindowHandle, 0, 0, this.Width, this.Height, true);

我添加了一个 Form1_Resize 事件,因此它会相应地调整大小。

String name = myProcess.SelectedTab.Name;
Process pHandle = (Process) sessions[name];
MoveWindow(pHandle.MainWindowHandle, 0, 0, this.Width, this.Height, true);