【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);

运行效果

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

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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/543161.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

三年了,期待下一个三年

第一个三年 时间好快,距离我发布我第一篇文章都已经三个年头了。 转眼也从大一新生变成了大四打工人。 在平台上发布博客,分享自己的项目、学习思路、解决的bug都带给我很多收获。 平台上的粉丝,阅读量等,也让我的简历更加出彩。…

数据结构初阶:二叉树(二)

二叉树链式结构的实现 前置说明 在学习二叉树的基本操作前,需先要创建一棵二叉树,然后才能学习其相关的基本操作。由于现在对二叉树结构掌握还不够深入,为了降低学习成本,此处手动快速创建一棵简单的二叉树,快速进入二…

【MATLAB应用】去噪算法

01.引言 图像的产生是电子和光学相互作用的结果,而图像中的噪声则是由于成像过程中的颗粒性质而客观存在的。不同类型的噪声从不同的视角产生,各自具有特点。因此,有效地去除图像中的噪声以获得更高质量的图像具有实际意义。目前存在多种图像…

IPD集成产品开发

时间:2024年04月14日 作者:小蒋聊技术 邮箱:wei_wei10163.com 微信:wei_wei10 解密IPD集成产品开发_小蒋聊技术_免费在线阅读收听下载 - 喜马拉雅欢迎收听小蒋聊技术的类最新章节声音“解密IPD集成产品开发”。大家好&#xff…

MAT工具详解

简介 Java自带的JVisualVm可以用来分析Java堆内存,可以用来排查内存泄漏和内存浪费的问题,但是功能不是特别强大, MAT(Memory Aanlysis Tool)是一款更优的工具。 MAT功能 功能组 全局信息 直方图 按照类的数量倒序…

AI大模型日报#0413:谷歌引入“无限注意力”、Picsart AI 开源120秒超长AI视频模型

导读: 欢迎阅读《AI大模型日报》,内容基于Python爬虫和LLM自动生成。目前采用“文心一言”生成了每条资讯的摘要。 标题: 速递|木头姐 ARK 宣布已投资 OpenAI!还将 Anthropic 及 Figure1 等 AI 独角兽一网打尽摘要: ARK已通过其风…

Zookeeper和Kafka的部署

目录 一、Zookeeper的基本概念 1. Zookeeper定义 2. Zookeeper工作机制 3. Zookeeper特点 4. Zookeeper数据结构 5. Zookeeper应用场景 5.1 统一命名服务 5.2 统一配置管理 5.3 统一集群管理 5.4 服务器动态上下线 5.5 软负载均衡 6. Zookeeper 选举机制 6.1 第一…

MySQL——链表

主键:非空 唯一(针对整列数据而言) 为了方便管理一般主键都是设置为自增 外键:一张表中的一列的值是另一张表的主键,使用外键建立两张数据表的数据关系 一、两张表连接 将两张表格拼接成一个表 1、格式:s…

kali桥接校园网实现上网

1.查看校园网信息 1. vim /etc/network/interfaces 添加下列信息,地址、网关、掩码和主机一样即可 3.vim /etc/resolv.conf 添加dns解析 4.macchanger -m AA:bb:cc:DD:ee:ff eth0(改为和主机一样的mac) 5. /etc/init.d/networking restart 重启网络即可

【Python函数和类4/6】递归与匿名函数

目录 目标 匿名函数 多个形参 匿名函数的局限性 递归 语言例子 数学例子 递归的实现 递归代码 练习 总结 目标 在之前的博客中,我们学习了定义函数、调用函数以及设置函数的参数。在今天,我们会补充函数的两个常见的知识点,一个是匿…

【Linux】安装及管理程序

目录 一、Linux应用程序基础 1.应用程序与系统命令 2.典型应用程序的目录结构 3.软件包封装类型 二、RPM 1.RPM 软件包管理器 2.RPM软件包命名格式 3.RPM命令的格式 4.查询已安装的rpm软件信息 5.查询未安装的 RPM 软件包文件中信息 6.安装、升级、卸载 RPM 软件包 …

gitlab:Could not resolve host

fatal: unable to access http://xxx.git/: Could not resolve host: yyy Git-fatal: unable to access ‘https://gitlab.XX.git/‘: Could not resolve host: gitlab.XX.com.cn_drone unable to access .git/: could-CSDN博客 原因: 克隆的时候使用的是这里的HTT…

jenkins+docker集成harbor实现可持续集成

目录 一、前言 二、Harbor介绍 2.1 什么是Harbor 2.1.1 Harbor架构图 2.2 Harbor 特征 2.3 Harbor 核心组件 2.4 Harbor使用场景 三、Harbor部署 3.1 安装docker compose 3.1.1 安装方式一 3.2 基于python3 pip安装docker compose 3.2.1 安装python3 3.2.2 安装pyt…

我的新书,在西西弗书店上架了!

大家好,我是程序员小灰。今天告诉大家一个好消息,我的新书在西西弗书店上架了! 熟悉小灰的朋友都知道,我以前是京东的一名程序员,现在全职投入到IT领域的自媒体创作。在2019年,我出版了人生中的第一本书《漫…

MacBook Pro找不到fffmpeg

报错信息 ffmpeg: command not found 在macOS上,可以使用Homebrew通过运行brew install ffmpeg 这期间可能涉及brew的更新

使用 MTK 迁移 Oracle 11g 数据库 至 MogDB 3.0 运维指南

一、环境概述 本次是进行Oracle到MogDB测试迁移,具体生产迁移,还需考虑更多步骤细节,请查看MogDB官方文档。 操作系统版本内核版本数据库类型数据库版本字符集数据库端口源端CentOS release 6.8 (Final)2.6.32-642.el6.x86_64单机Oracle 11.2…

[C++]哈希应用之位图布隆过滤器

🪐🪐🪐欢迎来到程序员餐厅💫💫💫 主厨:邪王真眼 主厨的主页:Chef‘s blog 所属专栏:c大冒险 总有光环在陨落,总有新星在闪烁 前言: 我们之前…

【Spring进阶系列丨第九篇】基于XML的面向切面编程(AOP)详解

文章目录 一、基于XML的AOP1.1、打印日志案例1.1.1、beans.xml中添加aop的约束1.1.2、定义Bean 1.2、定义记录日志的类【切面】1.3、导入AOP的依赖1.4、主配置文件中配置AOP1.5、测试1.6、切入点表达式1.6.1、访问修饰符可以省略1.6.2、返回值可以使用通配符,表示任…

【深度学习实战(3)】打印自己模型的推理帧率

一、FPS(每秒传输帧数-Frames Per Second) FPS就是目标网络每秒可以处理(检测)多少帧(多少张图片),FPS简单来理解就是图像的刷新频率,也就是每秒多少帧,假设目标检测网络处理1帧要0.02s,此时FPS就是1/0.0250 其中Processing tim…

配置DHCP服务器实现为动态客户端和静态客户端分配不同网络参数

相关学习推荐:什么是DHCP?为什么要使用DHCP? 华为HCIP课程【视频教程】:华为HCIP必考题:DHCP协议原理与配置 组网需求 如图1所示,Router作为企业出口网关,PC和IP Phone为某办公区办公设备。为了方便统一管…