C# WinForms 中嵌入 EXE 程序

在 C# WinForms 应用程序中,有时我们希望嵌入并控制其他 EXE 程序。这可以通过 Windows 提供的 API 来实现。本文将介绍如何在 WinForms 应用程序中嵌入并控制外部 EXE 程序。

什么是嵌入 EXE 程序

嵌入 EXE 程序是指在一个 WinForms 应用程序中启动并控制另一个 EXE 程序的过程。这可以通过设置子窗口来实现,其中子窗口承载外部程序的窗口。

实现步骤

1. 创建 WinForms 项目

首先,创建一个新的 WinForms 应用程序。

复制代码

shell

go 复制代码
dotnet new winforms -o EmbedExeApp
cd EmbedExeApp

2. 准备外部 EXE 程序

确保你有一个可以嵌入的外部 EXE 程序。这个程序可以是任何 Windows 应用程序,例如记事本、画图或其他自定义程序。

3. 使用 Windows API 嵌入 EXE

要嵌入外部 EXE,你需要使用一些 Windows API 函数,如 SetParent、ShowWindow 和 MoveWindow。这些函数可以通过 P/Invoke 在 C# 中调用。

复制代码

csharp

go 复制代码
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows.Forms;

public partial class MainForm : Form
{
    private const int GWL_STYLE = -16;
    private const int WS_VISIBLE = 0x10000000;

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

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

    [DllImport("user32.dll", SetLastError = true)]
    private static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);

    public MainForm()
    {
        InitializeComponent();
    }

    private void EmbedProcess(string processPath)
    {
        ProcessStartInfo startInfo = new ProcessStartInfo(processPath)
        {
            UseShellExecute = false,
            CreateNoWindow = true
        };

        Process process = Process.Start(startInfo);
        IntPtr childHandle = process.MainWindowHandle;
        SetParent(childHandle, this.Panel1.Handle);
        ShowWindow(childHandle, 1);
        MoveWindow(childHandle, 0, 0, this.Panel1.Width, this.Panel1.Height, true);
    }

    private void btnEmbedCalc_Click(object sender, EventArgs e)
    {
        EmbedProcess("calc.exe");
    }
}

4. 调用嵌入函数

在窗体中添加一个按钮,当点击按钮时,调用嵌入函数。

复制代码

csharp

go 复制代码
private void btnEmbedCalc_Click(object sender, EventArgs e)
{
    EmbedProcess("calc.exe"); // 嵌入计算器程序
}

5. 运行并测试

运行你的 WinForms 应用程序并点击按钮,你应该会看到计算器程序嵌入到你的窗体中。

注意事项

  • 确保在多线程环境下安全地访问 UI 控件。

  • 在调试和发布应用程序时,确保外部 EXE 文件的路径正确。

  • 嵌入的 EXE 程序应该与主应用程序兼容,特别是在 DPI 和窗口尺寸方面。

结论

通过上述步骤,我们可以在 WinForms 应用程序中实现类似 Android 的 Toast 消息提示效果。这种提示方式不会阻断用户操作,可以提供更流畅的用户体验。希望本文的示例代码能够帮助你在开发中实现这一功能。

往期精品推荐:

在国内默默无闻的.NET,在国外火的超乎想象?

C#的膨胀之路:创新还是灭亡

介绍.NET 6款好看的winform开源UI库

介绍一款最受欢迎的.NET 开源UI库

WPF第三方开源UI框架:打造独特体验的魔法师

WPF与Winform,你的选择是?

WinForm的前世今生

.NET成年了,然后呢?------编程界的逆袭传奇

相关推荐
OxYGC15 分钟前
[工程] PHP2Shell 漏洞解析:两条 PHP 内核 RCE,为什么应用层的防护全部失效
android·开发语言·php
小徐不徐说18 分钟前
数据库存储基础:理解表结构、主键、事务与 BLOB
开发语言·数据库·c++·qt·程序设计
草莓熊Lotso32 分钟前
【C++ 基于微服务的即时通讯系统】网关基建:cpp-httplib 与 WebSocketpp 从入门到实战
linux·开发语言·数据库·c++·redis·微服务·云原生
李纲明34 分钟前
WordPress 媒体库上传失败或一直转圈:先核 PHP 上传限制与目录权限,再查安全插件与对象存储
运维·开发语言·安全·php·wordpress·媒体库·devdiy
吃一碗粉只付一碗钱9 小时前
12-给SPA友好的401和403响应
c#·状态模式
第九序言T9 小时前
Python 数据处理进阶(十八)批量处理同结构文件:一个文件夹一次跑完
开发语言·python·自动化·pandas·数据处理
龙亘川10 小时前
构建城市公共安全数字底座:亘川智城智慧安防系统全维度解读
java·大数据·开发语言·人工智能·信息可视化
程序喵大人10 小时前
【C++入门】内存模型与资源管理 - 09 shared_ptr 和 weak_ptr 解决共享,也带来代价
开发语言·c++·资源管理·智能指针·内存模型
Raas10011 小时前
AI网关部署方案?从部署到上线全流程
java·开发语言·人工智能·gateway·ai网关·企业级ai网关·企业级ai产品
专注仿真12 小时前
线性回归和逻辑回归算法详解
开发语言·人工智能·python·大模型训练·控制算法