You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 00:44:58