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

打开notepad.exe时如何触发指定WinForms应用程序自动启动?

实现方案1:IFEO(映像文件执行选项)劫持(直接满足notepad主动触发需求)

该方案利用Windows原生的调试机制实现,只要notepad.exe启动就会优先触发你的WinForms程序运行:

  • 打开注册表编辑器,定位到路径 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
  • 新建名为 notepad.exe 的子项
  • 在notepad.exe子项中新建字符串值,名称为Debugger,数值数据填写你的WinForms程序完整绝对路径,例如 D:\MyOverlay\MyOverlayApp.exe
  • 在你的WinForms程序入口处增加逻辑:接收IFEO传入的notepad启动参数,先启动原始notepad进程,再完成overlay挂载
  • 核心代码示例:
using System.Diagnostics;
using System.Runtime.InteropServices;

// Win32 API声明
[DllImport("user32.dll")]
static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
[DllImport("user32.dll")]
static extern bool GetClientRect(IntPtr hWnd, out RECT lpRect);
public struct RECT { public int Left; public int Top; public int Right; public int Bottom; }

// 程序入口逻辑
[STAThread]
static void Main(string[] args)
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    if (args.Length > 0 && args[0].EndsWith("notepad.exe", StringComparison.OrdinalIgnoreCase))
    {
        // 启动原始notepad,注意此处需用Win32 API CreateProcess传入调试标志绕过IFEO二次触发,避免递归启动
        Process notepad = Process.Start(args[0], string.Join(" ", args.Skip(1)));
        notepad.WaitForInputIdle(3000);
        if (notepad.MainWindowHandle != IntPtr.Zero)
        {
            OverlayForm overlay = new OverlayForm();
            // 设置overlay窗体属性
            overlay.FormBorderStyle = FormBorderStyle.None;
            overlay.TopLevel = false;
            overlay.ShowInTaskbar = false;
            // 挂载为notepad子窗口
            SetParent(overlay.Handle, notepad.MainWindowHandle);
            // 适配notepad客户区大小
            GetClientRect(notepad.MainWindowHandle, out RECT rect);
            overlay.Size = new Size(rect.Right - rect.Left, rect.Bottom - rect.Top);
            overlay.Location = Point.Empty;
            overlay.Show();
        }
    }
    Application.Run();
}

注意:IFEO修改需要管理员权限,64位系统下32位程序的IFEO配置路径为HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Image File Execution Options


实现方案2:WMI进程启动事件监听(无系统修改,兼容性更高)

如果不想修改系统注册表,可以做一个轻量后台常驻程序,监听系统进程启动事件,检测到notepad.exe启动时自动拉起你的WinForms overlay程序:

  • 后台监控程序核心代码:
using System.Management;

// 初始化WMI进程启动监听
WqlEventQuery startQuery = new WqlEventQuery("SELECT * FROM Win32_ProcessStartTrace WHERE ProcessName='notepad.exe'");
ManagementEventWatcher startWatcher = new ManagementEventWatcher(startQuery);
startWatcher.EventArrived += (sender, e) =>
{
    int notepadPid = Convert.ToInt32(e.NewEvent.Properties["ProcessID"].Value);
    // 启动overlay程序,将notepad进程ID作为参数传入
    Process.Start(@"D:\MyOverlay\MyOverlayApp.exe", notepadPid.ToString());
};
startWatcher.Start();
  • overlay程序启动后根据传入的进程ID获取notepad窗口句柄,后续挂载逻辑和方案1一致
    该方案无需修改系统配置,误报毒概率更低,仅需要后台监控程序开机自启即可

核心注意事项

  • 挂载子窗口前必须将overlay窗体的TopLevel属性设为false,FormBorderStyle设为None,否则会出现层级异常
  • 可以通过SetWinEventHook监听notepad的EVENT_OBJECT_LOCATIONCHANGE事件,同步调整overlay窗口大小和位置
  • 需要监听notepad的进程退出事件,overlay窗口同步退出,避免残留无主窗口

内容的提问来源于stack exchange,提问作者BeginnerDeveloper

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 11:27:04