【WinForm】如何在自己的程序窗口中显示并调用外部桌面程序

当你爱上一个程序的功能,并且希望扩展它以满足自己的需求时,你可能会觉得困惑。毕竟,你已经为此付出了很多努力,并希望能够有效地整合这些功能。那么,是否可以将这些功能嵌套到自己的程序中呢?

首先,你可能会觉得这是不可能的,但实际上,这是完全有可能的。下面,我将为你提供一些关于如何实现这一目标的建议。

如果你具备编程技能,你可以自己编写代码来扩展该程序的功能。

你可以从了解该程序的API(应用程序接口)开始。API是一种允许不同软件应用程序相互通信的接口。通过了解API,你可以了解该程序的功能是如何实现的,并找到扩展它的方法。

这可能需要一些时间和努力,但如果你愿意投入时间和精力,这将是一个非常有价值的经验。

总之,将你喜欢的程序功能嵌套到自己的程序中是完全可能的。

接下来,我将详细讲解操作步骤。

新建项目

新建一个项目WinForm,在设计窗口中添加一个控件panel,设置黑色背景,

以这个控件用来显示外部的桌面程序窗口,如下图
在这里插入图片描述

打开外部程序

在窗口加载事件中,编写一段代码,如下

var pStartInfo = new ProcessStartInfo(Path.Combine(Application.StartupPath, ResourcesName, "test_desktop.exe"), "test")
{
    UseShellExecute = false,
    CreateNoWindow = true,
    WindowStyle = ProcessWindowStyle.Hidden
};
var p = Process.Start(pStartInfo);

以上是创建一个进程, 用于打开外部的程序, 例如test_desktop.exe是一个桌面程序,

嵌套外部程序

这个进程需要进一步处理, 代码如下


//p.WaitForInputIdle();//如果报错提示无图形界面,将这个注释再试

while (p.MainWindowHandle.ToInt32() == 0)
{
    Thread.Sleep(100);
}

const int WS_CAPTION = 0x00C00000;
const int WS_THICKFRAME = 0x00040000;
const int GWL_STYLE = -16;

Int32 wndStyle = GetWindowLong(p.MainWindowHandle, GWL_STYLE);

//设置无标题,不可调宽高
SetWindowLong(p.MainWindowHandle, GWL_STYLE, wndStyle & ~WS_CAPTION & ~WS_THICKFRAME);

var handle = panel1.Handle;
//设置程序父窗体里的组件为 panel1.Handle
SetParent(p.MainWindowHandle, handle);
//还可以调整窗体位置和宽高
//MoveWindow(p.MainWindowHandle, 0, 0, device.screenSize.Width, device.screenSize.Height, true);
//不要设置其它,如ProcessWindowStyle.Normal 会不显示
ShowWindowAsync(p.MainWindowHandle, (int)ProcessWindowStyle.Maximized);

注意panel1是控件panel的实例,已添加到父窗体中,
如用var panel1 = new Panel()创建的,可能会导致意料之外的问题

相关依赖库

以上有一些方法并不存在,使用前需要先导入一些系统链接库,代码如下

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

[DllImport("user32.dll")]
static extern bool ShowWindowAsync(IntPtr hWnd, int cCmdShow);

[DllImport("user32.dll")]
public static extern int GetWindowLong(IntPtr hWnd, int nIndex);

[DllImport("user32.dll")]
public static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);

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

运行效果

在完成上述内容编写后,若无误,便可进行编译运行。

正如我们所期望和预见的那样,将会看到原本的黑色背景区域被外部桌面程序的窗口所覆盖展示。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TA远方

谢谢!收到你的爱╮(╯▽╰)╭

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值