WPF嵌入外部exe应用程序-去除子窗体边框样式

news2024/11/25 3:07:10

WPF嵌入外部exe应用程序-去除子窗体边框样式

  • 去除子窗体边框样式
    • 导入winodows API
    • 使用API去除边框
    • 报错:
    • 解决
    • 实现效果
  • 完整实现代码

接着上一篇WPF嵌入外部exe应用程序-实现基本的嵌入,解决子窗体边框样式问题,去掉子窗体样式,让其融为一体,更像一个整体的软件。。。

去除子窗体边框样式

导入winodows API

设置窗体样式需要用到Windows APIGetWindowLongSetWindowLong,函数原型如下:
在这里插入图片描述
在这里插入图片描述

C#中DllImport加载静态方法


[DllImport("user32.dll", EntryPoint = "GetWindowLongA", SetLastError = true)]
public static extern long GetWindowLong(IntPtr hwnd, int nIndex);

[DllImport("user32.dll", EntryPoint = "SetWindowLongA", SetLastError = true)]
public static extern long SetWindowLong(IntPtr hwnd, int nIndex, long dwNewLong);

使用API去除边框

//appWin为子窗体句柄
var style = GetWindowLong(appWin, GWL_STYLE); 
SetWindowLong(appWin, GWL_STYLE, style  &~WS_CAPTION & ~WS_THICKFRAME);

API中用到的常量字段:

        /// <summary>
        /// GetWindowLong中表示获得窗口样式
        /// SetWindowLong中表示设定一个新的窗口风格。
        /// </summary>
        const int GWL_STYLE = (-16);
        /// <summary>
        /// 窗口具有标题栏
        /// </summary>
        const int WS_CAPTION = 0x00C00000;
        /// <summary>
        /// 窗口具有调整大小边框。
        /// </summary>
        const int WS_THICKFRAME = 0x00040000;

更多的窗口样式常量可以看官网
窗口样式-https://learn.microsoft.com/zh-cn/windows/win32/winmsg/window-styles

报错:

这里有个坑,根据函数原型实现类型用long,但是win32中long类型也是32位,而C#中long是64位的所以会导致报错
在这里插入图片描述

解决

将上述加载的windowsAPI的long类型都改成int,改完之后能正常执行

        [DllImport("user32.dll", EntryPoint = "GetWindowLongA", SetLastError = true)]
        public static extern int GetWindowLong(IntPtr hwnd, int nIndex);

        [DllImport("user32.dll", EntryPoint = "SetWindowLongA", SetLastError = true)]
        public static extern int SetWindowLong(IntPtr hwnd, int nIndex, int dwNewLong);

实现效果

成功去除边框

在这里插入图片描述

完整实现代码

    public partial class MainWindow : Window
    {
        [DllImport("user32.dll", SetLastError = true)]
        public static extern long SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

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


        [DllImport("user32.dll", EntryPoint = "GetWindowLongA", SetLastError = true)]
        private static extern int GetWindowLong(IntPtr hwnd, int nIndex);

        [DllImport("user32.dll", EntryPoint = "SetWindowLongA", SetLastError = true)]
        private static extern int SetWindowLong(IntPtr hwnd, int nIndex, int dwNewLong);

        /// <summary>
        /// GetWindowLong中表示获得窗口样式
        /// SetWindowLong中表示设定一个新的窗口风格。
        /// </summary>
        const int GWL_STYLE = (-16);
        /// <summary>
        /// 窗口具有标题栏
        /// </summary>
        const int WS_CAPTION = 0x00C00000;
        /// <summary>
        /// 窗口具有调整大小边框。
        /// </summary>
        const int WS_THICKFRAME = 0x00040000;

        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
           var exeName = "C:\\WINDOWS\\system32\\mspaint";
          //使用Process运行程序
            Process p = new Process();
            p.StartInfo.FileName = exeName;
            p.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
            p.Start();
            //获取窗体句柄
            while (p.MainWindowHandle.ToInt32() == 0)
            {
                System.Threading.Thread.Sleep(100);
            }
            IntPtr appWin = p.MainWindowHandle;//子窗体(外部程序)句柄
            IntPtr hwnd = new WindowInteropHelper(this).Handle;//当前窗体(主程序)句柄
           //设置父窗体(实现窗体嵌入)
            SetParent(appWin, hwnd);
            //设置窗体样式
            var style = GetWindowLong(appWin, GWL_STYLE);
            SetWindowLong(appWin, GWL_STYLE, style & ~WS_CAPTION & ~WS_THICKFRAME);

            //设置窗体位置和大小
            MoveWindow(appWin, 0, 0, 500, 400, true);
           
        }
    }

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

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

相关文章

家政上门小程序|同城家政预约上门小程序开发|上门家政软件源码

随着生活水平的提高&#xff0c;越来越多的人开始借助家政服务来解决日常生活中的琐事。为了方便用户寻找和预约家政服务&#xff0c;家政上门小程序应运而生。家政上门小程序开发具有多种功能&#xff0c;使其成为家政服务行业的重要工具。本文将介绍一些家政上门小程序开发的…

品牌营销策略:如何有效打造品牌知名度与口碑?

品牌营销策略是企业在市场竞争中脱颖而出的重要手段&#xff0c;它能够帮助企业树立品牌形象&#xff0c;提升品牌知名度&#xff0c;增强品牌影响力&#xff0c;从而获得更多的市场份额和利润。那么&#xff0c;如何制定一套有效的品牌营销策略呢&#xff1f;以下是一秒推小编…

《向量数据库指南》:向量数据库Pinecone管理索引教程(一)

在本节中,我们将说明如何获取索引列表、创建索引、删除索引和描述索引。 要了解与索引相关的概念,请参见索引。 ⚠️警告 Starter(免费)计划上的索引将在7天的不活动后被删除。为了 防止这种情况,请发送任何API请求或登录控制台。这将计算为 活动。 获取有关您的索…

解决appium-doctor报 mjpeg-consumer cannot be found

解决appium-doctor报 mjpeg-consumer cannot be found npm i -g mjpeg-consumer

深入开箱跑分全志A523平板电脑 台电P26T

首先外观和观感就不说了&#xff0c;图都有&#xff0c;来看看内部实际的东西。 主控全志A523M00X0000&#xff0c;配套Android 13 5.15 Kernel系统。4G内存&#xff0c;64G eMMC&#xff0c;屏幕1280*800分辨率。 平板开启了安全启动所以想买来开发刷机可以歇歇了 &#xf…

C++基础项目实战之通讯录管理系统

赶时间的可以看改进版的通讯录管理系统 通讯录管理系统 文章目录 通讯录管理系统1. 系统需求2. 菜单功能3. 退出功能4. 添加联系人4.1 设计联系人结构体4.2 设计通讯录结构体 5. 显示联系人5.1 封装显示联系人函数 6. 删除联系人6.1 封装检测联系人是否存在6.2 封装删除联系人函…

再度合作|极智嘉(Geek+) P系列拣选机器人进驻CEVA欧洲物流中心

近日&#xff0c;3PL巨头CEVA Logistics首度在社交媒体展示其与极智嘉(Geek)合作打造的全新欧洲物流中心&#xff0c;并在推文中对极智嘉(Geek)给予了高度赞扬。CEVA表示&#xff0c;极智嘉不仅彻底颠覆了CEVA的工作环境&#xff0c;还充分保障了敬业员工的安全和人体工程学效率…

2.6 线性表的逆置

逆置: 将表中的元素调整成与原来相反的顺序. 1. 顺序表的逆置 图1. 顺序表的逆置 用temp存储要交换的元素, temp arr[ i ]; arr[ i ] arr[ j ]; arr[ j ] temp; 然后i, j--. 若数组长度为偶数, 则i > j时结束循环; 若数组长度为奇数, 则i > j时结束循环. 也即不管数…

ABAP W CVI_EI 047 对供应商,不支持初始的 OBJECT_TASK

调BAPI:cl_md_bp_maintain>maintain修改供应商失败&#xff0c;提示 W CVI_EI 047 对供应商&#xff0c;不支持初始的 OBJECT_TASK 很可能是vendor-header中的object_task没有赋值 ls_data-vendor-header-object_task ‘U’.

C进阶:指针的进阶(3)

函数指针 首先来看一段代码&#xff1a; #include <stdio.h>void test() {printf("hehe\n"); }int main() {printf("%p\n", test);printf("%p\n", &test);return 0; } 让我们来看一下执行结果吧&#xff1a; 从上述结果得出&#x…

OCR-字符识别笔记

安装 环境依赖 Linux | Windows | macOSPython 3.7PyTorch 1.6 或更高版本torchvision 0.7.0CUDA 10.1NCCL 2GCC 5.4.0 或更高版本准备环境 注解 如果你已经在本地安装了 PyTorch,请直接跳转到安装步骤。 第一步 下载并安装 Miniconda. 第二步 创建并激活一个 conda 环境…

[PCIE体系结构导读]PCI和PCI中断

PCI PCI总桥由HOST主桥和PCI桥推出&#xff0c;HOST主桥与主存储器控制器在同一级总线上&#xff0c;因此PCI设备可以方便地通过HOST主桥访问主存储器&#xff0c;即进行DMA操作。 PCI设备的DMA操作需要与处理器系统的Cache进行一致性操作&#xff0c;当PCI设备通过HOST主桥访…

guava限流器RateLimiter使用简介(Springboot实现)

在大型分布式系统中&#xff0c;限流是一种重要的防护机制&#xff0c;可以帮助我们控制流量并减轻系统的负担。Google的Guava库提供了一种方便的限流器实现&#xff0c;可以帮助我们轻松地实现限流功能。本文将介绍Guava中限流器的基本概念和使用方法。 一、什么是限流器&…

二层交换机和三层交换机区别

一、指代不同 1、两层交换机&#xff1a;工作于OSI模型的第2层&#xff08;数据链路层&#xff09;&#xff0c;故而称为二层交换机。 2、三层交换机&#xff1a;具有部分路由器功能的交换机&#xff0c;工作在OSI网络标准模型的第三层。 二、功能不同 1、两层交换机&#xff1…

企业数字化转型需要解决哪些问题?

企业的数字化转型及利用技术和数字解决方案来改进业务流程、增强客户体验并推动整体增长。尽管每个企业的数字化转型之旅都是独特的&#xff0c;但仍需要解决几个常见问题以确保转型成功。其中一些问题包括&#xff1a; 1.抵制变革&#xff1a;数字化转型中最大的挑战之一是员…

国赛线下开赛!全国智能车百度智慧交通创意组区域赛今日正式拉开帷幕!

“全国大学生智能汽车竞赛”是教育部倡导的大学生科技A类竞赛&#xff0c;中国高等教育学会将其列为含金量最高的大学生竞赛之一&#xff0c;为《全国普通高校大学生竞赛排行榜》榜单内赛事。飞桨共承办了百度完全模型组和百度智慧交通组两大赛道。全国大学生智能汽车竞赛百度智…

ptmalloc底层原理剖析

目录 一、概述 二、基础了解 2.1 32位进程默认内存布局 2.2 brk & sbrk & mmap 三、内存管理 2.1 结构 2.1.1 main_arena 与 non_main_arena 2.1.2 malloc_chunk 2.1.3 空闲链表bins 2.1.4 初始化 2.2 内存分配与释放 三、ptmalloc、tcmalloc与jemalloc实现…

阿里云安装宝塔面板

阿里云安装宝塔面板 1.安装步骤2.需要加入安全组&#xff0c;打开端口3.安装宝塔 1.安装步骤 1.这里主要以阿里云的服务器 ECS为例子,需要安装纯净的系统 创建过程: 这边先用的是免费的: 2.需要加入安全组&#xff0c;打开端口 进入实例选项卡&#xff1a; 快速添加&…

一种利用旋转中心进行手眼标定的原理性介绍

首先,我们要了解一下常规的手眼标定流程是怎么样的。 (一)如果吸嘴中心就是法兰盘的中心则 是下面这样的: 按九宫格走九个点,取得九组吸嘴的像素坐标与法兰盘的机械坐标 (图1) 进行标定 (二)如果吸嘴位置不在法兰盘中心 则标定流程要复杂些: …

Redis定时的值莫名其妙丢失了(被删除),问题记录

首先是有效期为三天的值&#xff0c;莫名其妙的时间就没了&#xff0c;无效了。登录查看所有Redis的key&#xff0c;如下 发现存在四个未知的key&#xff0c;backup1 2 3 4。百度后发现可能是由于没有修改默认端口号加上未设置连接密码&#xff0c;所以准备修改这两处改完后的登…