VS2022运行WinForms程序后出现无限启动问题求助
问题解决:WinForms嵌入记事本重复弹窗问题
核心错误原因
你把记事本的程序名写错了:应该是notepad.exe,而非notebook.exe。系统找不到notebook.exe时,触发了异常逻辑,导致窗口不断弹出。
修正后的完整代码
using System; using System.Diagnostics; using System.Runtime.InteropServices; using System.Windows.Forms; namespace WinFormsEmbedNotepad { public partial class Form1 : Form { private const int WM_SYSCOMMAND = 0x0112; private const int SC_MAXIMIZE = 0xF030; private Process _notepadProcess; [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] public static extern bool SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] public static extern bool MoveWindow(IntPtr hWnd, int x, int y, int cx, int cy, bool repaint); public Form1() { InitializeComponent(); this.FormClosing += Form1_FormClosing; } private void Form1_Load(object sender, EventArgs e) { try { _notepadProcess = Process.Start("notepad.exe"); if (_notepadProcess == null) { MessageBox.Show("无法启动记事本程序"); return; } _notepadProcess.WaitForInputIdle(1000); if (_notepadProcess.MainWindowHandle == IntPtr.Zero) { MessageBox.Show("无法获取记事本窗口句柄"); _notepadProcess.Kill(); return; } SetParent(_notepadProcess.MainWindowHandle, panel1.Handle); SendMessage(_notepadProcess.MainWindowHandle, WM_SYSCOMMAND, SC_MAXIMIZE, 0); MoveWindow(_notepadProcess.MainWindowHandle, 0, 0, panel1.Width, panel1.Height, true); } catch (Exception ex) { MessageBox.Show($"启动出错:{ex.Message}"); _notepadProcess?.Kill(); } } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { if (_notepadProcess != null && !_notepadProcess.HasExited) { _notepadProcess.Kill(); } } } }
额外优化说明
- 增加错误捕获:避免启动失败导致的异常扩散
- 添加进程清理逻辑:窗体关闭时自动终止记事本,防止后台残留进程
- 修正API常量的十六进制写法,符合Win32编程惯例
- 提供窗口大小适配双重方案(最大化+手动调整)
内容的提问来源于stack exchange,提问作者Fellow
相关产品推荐
相关产品推荐

