同事间语言沟通困难,你没看错,大家使用的不同编程语言,为了节省转语言的不必要成本,我们需要这样的一个技术,将别的语言生成的exe嵌入到我们的winform程序当中
嵌入命令行程序
嵌入窗体程序
把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;
}
}
}
}
实现思路不能看出,先启动要嵌入的进程,获取该进程对象,等待该进程界面允许输入,将该进程的父窗口句柄修改为本窗口句柄,再显示出来,并把嵌入窗口移动到指定位置。
有时候需要注意不要嵌入自己!
此文仅介绍一种实现思路,需要好用的控件需要自行封装。
有的程序嵌入后会有奇怪的样式,此技术目前可用而不通用!比如我一开始做测试把记事本放进去效果就不太好。如果不是时间紧急,建议还是统一开发语言,分清应急和持续发展!