WinForm嵌入其他exe到自己的窗体中

背景

同事间语言沟通困难,你没看错,大家使用的不同编程语言,为了节省转语言的不必要成本,我们需要这样的一个技术,将别的语言生成的exe嵌入到我们的winform程序当中

效果

嵌入命令行程序

WinForm嵌入其他exe到自己的窗体中_第1张图片

嵌入窗体程序

WinForm嵌入其他exe到自己的窗体中_第2张图片

代码

把Form1.cs改名为MainForm.cs,再把MainForm.cs代码修改为如下

using System.Diagnostics;
using System.Runtime.InteropServices;

namespace PutWindowNet
{
    public partial class MainForm : Form
    {
        [DllImport("user32.dll", EntryPoint = "SetParent")]
        private static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

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

        [DllImport("user32.dll", SetLastError = true)]
        private static extern bool MoveWindow(IntPtr hwnd, int x, int y, int cx, int cy, bool repaint);

        public MainForm()
        {
            InitializeComponent();
            Load += MainForm_Load;
        }

        private void MainForm_Load(object? sender, EventArgs e)
        {
            GetOtherExe();
        }

        private void GetOtherExe()
        {
            //PutWindow为要嵌入的exe在任务管理器中的名字
            Process[] processes = Process.GetProcessesByName("PutWindow");
            foreach (Process process in processes)
            {
                process.WaitForInputIdle();
                SetParent(process.MainWindowHandle, Handle);
                ShowWindow(process.MainWindowHandle, (int)ProcessWindowStyle.Maximized);
                MoveWindow(process.MainWindowHandle, 0, 0, Width, Height, false);
                break;
            }

        }
    }
}

解析

实现思路不能看出,先启动要嵌入的进程,获取该进程对象,等待该进程界面允许输入,将该进程的父窗口句柄修改为本窗口句柄,再显示出来,并把嵌入窗口移动到指定位置。

注意

有时候需要注意不要嵌入自己!

此文仅介绍一种实现思路,需要好用的控件需要自行封装。

有的程序嵌入后会有奇怪的样式,此技术目前可用而不通用!比如我一开始做测试把记事本放进去效果就不太好。如果不是时间紧急,建议还是统一开发语言,分清应急和持续发展!

WinForm嵌入其他exe到自己的窗体中_第3张图片

你可能感兴趣的:(c#,开发语言)