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

news2024/11/19 9:22:54

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

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

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

你可以从了解该程序的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);

运行效果

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

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

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【操作系统专题】详解操作系统 | 操作系统的目标和功能 | 操作系统如何工作

🍁你好,我是 RO-BERRY 📗 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 目录 1.操作系统的目标和功能2…

计算机炸了,电子信息也是劝退专业?

还不是因为这个版本,计算机专业受到了制裁,导致这些偏计算机类的专业也受到了牵连 我本科的时候是一所双一流院校的计科专业,我们学校的电子信息专业堪称苦逼,我们计科学的东西,他们都要学,他们学的一些东…

如何使用 LangChain 构建基于LLMs的应用——入门指南

大型语言模型(LLMs)是非常强大的通用推理工具,在各种情况下都非常有用。 但是,与构建传统软件不同,使用LLMs存在一些挑战: 调用往往是长时间运行的,并且随着可用输出而逐步生成输出。与固定参数的结构化输入&#xf…

力扣面试150 整数转罗马数字 打表 + 贪心

Problem: 12. 整数转罗马数字 文章目录 思路💖 打表 贪心 思路 👨‍🏫 参考:打表贪心 💖 打表 贪心 class Solution {public String intToRoman(int num) {int[] value {1000, 900, 500, 400, 100, 90, 50, 40, …

微服务之Consul 注册中心介绍以及搭建

一、微服务概述 1.1单体架构 单体架构(monolithic structure):顾名思义,整个项目中所有功能模块都在一个工程中开发;项目部署时需要对所有模块一起编译、打包;项目的架构设计、开发模式都非常简单。 当项…

MGRE环境下运行OSPF

一、分析要求 自行定义公网网段和私有网段,ISP设备仅配置IP地址R1/R4/R5构建Full-Mesh结构R1/R2/R3构建Hub-Spoke结构,R1为NHS除ISP设备,其余路由器运行OSPF 二、实施过程 1. 配置IP及环回地址 R1 [R1]int g 0/0/0 [R1-GigabitEthernet0/…

运筹说 第112期 | M/M/s等待制排队模型

通过上期学习,大家已经了解了排队论中的一些基本概念,以及生灭过程和Poisson过程。 那么本期小编将基于这些基本原理,为大家介绍M/M/s混合制排队模型,包括单服务台模型和多服务台模型,介绍模型的概念以及推导过程等内容…

全栈的自我修养 ———— react实现滑动验证

实现滑动验证 展示依赖实现不借助create-puzzle借助create-puzzle 展示 依赖 npm install rc-slider-captcha npm install create-puzzleapi地址 实现 不借助create-puzzle 需要准备两张图片一个是核验图形,一个是原图------> 这个方法小编试了后感觉比较麻烦…

1panel更新系统

准备两个软件包 名为dist的前端包 以.jar为后缀的后端jar包 更新后端 进去1Panel管理页面(浏览器收藏里有) http://127.0.0.1:42689/f2a8a874bd 点击容器,将名为app的容器直接删除掉 打开软件electerm 点击书签,连接2222 连接成功后长这样&#xff…

咸鱼之王_手游_开服搭建架设_内购修复无bug运营版

视频演示 咸鱼之王_手游_开服 游戏管理后台界面 源码获取在文章末尾 源码获取在文章末尾 源码获取在文章末尾 或者直接下面 https://githubs.xyz/y28.html 1.安装宝塔 yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh &…

软考之零碎片段记录(十五)+复习巩固(十)

一、学习 1. 多对多关系模式 举例:学生和课程。顾客和商品等。 多对多关系的确立需要有中间表,需要使用两个外键确认表中的唯一数据。 2. 数据库范式 1nf 表中每个字段都是原子性不可查分的。在关系(或表)中,每一行…

软件设计师——软件工程基础知识

软件工程基础知识 软件过程软件过程模型软件测试方法进度管理软件复杂性度量环路复杂度耦合聚合和组合 软件过程 软件过程模型 软件测试方法 黑盒测试和白盒测试 白盒测试中,语句覆盖对程序执行逻辑的覆盖很低,因此一般认为它是很弱的逻辑覆盖。 进度管…

微服务架构使用和docker部署方法(若依)

这里以若依官方网站开源的微服务框架为例子记录使用方法过程。 开源地址:RuoYi-Cloud: 🎉 基于Spring Boot、Spring Cloud & Alibaba的分布式微服务架构权限管理系统,同时提供了 Vue3 的版本 下载后,用IDEA社区版开发工具打…

Vol.41 SEO基本术语解释

1.TDK TDK:即标题、描述、关键词;TDK是网站的基本属性,对SEO非常重要,可以帮助搜索引擎了解你的网站; T:title 谷歌建议不超过70个字符 D:description 谷歌建议不超过150个字符 K&#xff1…

麒麟服务器操作系统安装DHCP服务02

原文链接:麒麟服务器操作系统安装DHCP服务02 Hello,大家好啊!继昨天介绍了在麒麟服务器操作系统上部署DHCP服务并演示了终端自动获取IP地址的过程之后,今天我们将进一步探讨如何通过绑定终端的MAC地址来为其分配固定的IP地址。这种…

【一竞技DOTA2】ESL ONE伯明翰站分组名单出炉

1、ESL ONE伯明翰站即将在4月22号开战,小组赛分组名单也正式出炉。 A组队伍名单:BB、G2xiG、SR、Talon、Falcons、Liquid B组队伍名单:GG、Heroic、OG、Spirit、Tundra、XG 小组赛是常规Bo2循环赛(4月22日-4月24日)各个小组的前两名晋级胜者组,三四名晋级败者组,五六名被淘汰…

二十款好用的屏幕录制,绿色绿色好用软件工具,云盘下载

本人收藏多年的屏幕录制工具,绿色的,你懂得的。。。。 二十款好用的屏幕录制,绿色绿色好用软件工具,值得收藏 下载地址: 链接:https://pan.baidu.com/s/1RPTlFfeap4TGMnDPgCEo-w?pwdmaky 提取码&#xff1…

【Linux】进程基础铺垫(三)软件基础:系统调用接口

系统调用接口 前言:系统调用接口的引入例子理解 总结小图一、系统调用接口二、底层封装 系统调用接口1. printf && scanf 重新理解 三、库函数 与 系统调用函数 前言:系统调用接口的引入 例子理解 就好比 去银行取钱,银行不可能让你…

硬件开发相关的流程文件介绍

学习目的:前面文章有简要介绍硬件开发的基本过程,本文会细分硬件开发的流程,然后分作5个步骤,详细介绍开发全过程,包括立项-实施项目-软件开发-测试-验收 这几个过程,然后,再分解对每一个步骤进…

二叉树(二)———链式二叉树结构

链式结构 链式二叉树的存储结构是指用链表来表示一棵二叉树,即用链表来指示元素的逻辑关系。通常的方法是链表中的每个节点由三个域组成,数据域与左右指针域,左右指针分别用来存储该节点左孩子和右孩子所在链节点的存储位置,这种…