Unity 设置窗口置顶超级详解版

目录

前言

一、user32.dll

1.什么是user32.dll

2.如何使用user32.dll

 二、句柄Handle

1.句柄

2.句柄的功能

3.拿句柄的方法

三、窗口置顶

1.窗口置顶的方法

2.参数说明

3.使用方法 

四、作者的碎碎念


前言

up依旧挑战全网讲解最详细版本~~

本篇文章讲解的是unity打包了window的安装包使用的窗口设置,安卓之类的不在此列~

一、user32.dll

1.什么是user32.dll

想要窗口置顶,其实已经不是在控制软件了,实际上请求的是windows的帮助,告诉系统:“系统,把我放到最上面~”。

这时候就需要和系统做一些交互,让我们去写和系统交互这部分代码,那是不可能的。我们就知道怎么用就行。user32.dll是微软写好的文件,里面封装了很多方法,可以让我们直接和系统交互。

备注:

up这里只讲和窗口置顶相关的方法。如果你想知道,还有哪些方法呢?可以查询下方链接。

Windows API 索引 - Win32 apps | Microsoft Learn

windows系统是微软公司研发的,所以这个网页是微软公司放出来,给大家写的一些说明书,还有其他内容可以查到,大家可以自己查询。

如果你真的去查阅了,你会发现,他的方法和我们是不一样的的。

(如图2所示方法)IntPtr GetForegroundWindow()

链接是:

GetForegroundWindow 函数 (winuser.h) - Win32 apps | Microsoft Learn

在原文中是:

图1 方法GetForegroundWindow()

你会发现画红圈圈那里是不一样的,那怎么办呢?

因为,在封装的时候,使用词汇进行了一点改变,在另外一个链接里有说明:

用平台调用封送数据 - .NET Framework | Microsoft Learn

图2 部分分装说明

在C#中,我们所有的HWND,都被Intptr代替。

全部表格如下:

2.如何使用user32.dll

因为,我们的方法都来自于这个dll,所以我们每次要把dll里的方法拿出来,我们才能用。所以我们每一个系统方法上面,必须要写[DllImport("user32.dll")](如图3所示)

图3 引用user32.dll

 二、句柄Handle

1.句柄

关于为什么这么翻译,up在网上没有找到官方的说明,这里up自己的理解是“句子的手柄”。

句子代表我们写的很多代码,手柄就是平时玩游戏的手柄,我们通过句柄来控制东西。我们需要这个控制的权限。

2.句柄的功能

我们看见的每个窗口,都有个专用的手柄,你要控制谁,就需要拿到这个手柄。(如图4,单纯皮一下所示)

图4 孙悟空吸句柄

3.拿句柄的方法

下方函数的意思是,寻找句柄,并返回句柄。

官方链接:FindWindowExA 函数 (winuser.h) - Win32 apps | Microsoft Learn

HWND FindWindowExA(
  [in, optional] HWND   hWndParent,
  [in, optional] HWND   hWndChildAfter,
  [in, optional] LPCSTR lpszClass,
  [in, optional] LPCSTR lpszWindow
);

上面是官方给的C++的代码,按照表格,我们翻译成C#的代码。

[DllImport("user32.dll")]
static extern IntPtr FindWindowExA(
IntPtr hWndParent, 
IntPtr hWndChildAfter, 
string lpszClass, 
string lpszWindow);

这里解释一下里面不常见的词汇:

extern:因为这个方法不是unity自带的,而是user32.dll里面的,所以如果直接写,就会报错,因为他会在你所有的代码里面查一遍,发现查不到FindWindowExA这个方法,就会报错。(如图5所示),所以在方法中必须标明,这是外部方法,不要在代码里找了,找不到的。

因此,这个单词一般和[DllImport("*****")]一起出现。

图5 方法报错

IntPtr:声明句柄,这里就不多说了


参数解释:

IntPtr hWndParent:父窗口的句柄        窗口也分父子窗口(如图6所示),浏览器就是父窗口,浏览器中,还有好多子窗口。所以查找时候,会问你,要在哪个父窗口下找吗?如果这里填IntPtr.Zero,那就是,查找所有的父窗口。

图6 浏览器

IntPtr hWndChildAfter:从某个子窗口句柄往后开始找 (如图6所示),如果我想从Unity屏幕置顶往后开始找,那我这里就要把这个窗口的句柄传进去,同样,如果填IntPtr.Zero,那就是,查找所有的子窗口。

string lpszClass:窗口类别        窗口是有很多类别的,除了刚看的浏览器这种窗口,开始菜单栏也属于窗口。显然,这不是一个类别的窗口,所以,如果你对窗口类别有限制,就填在这里。如果没有,就填写null

图7 菜单窗口

string lpszWindow: 窗口名称        输入你要找的窗口名称,对unity打包后的软件来说,窗口名称就是软件的名称,就是(如图8所示)。

图8 unity最终打包后的窗口名称

 到此为止,通过使用这个方法,我们就可以拿到软件的句柄了。

    [DllImport("user32.dll")]
    static extern IntPtr FindWindowExA(IntPtr hWndParent, IntPtr hWndChildAfter, string lpszClass, string lpszWindow);

    public string projectName;
    IntPtr intPtr;
    void Start()
    {
        intPtr = FindWindowExA(IntPtr.Zero, IntPtr.Zero, null, projectName);
    }

三、窗口置顶

1.窗口置顶的方法

官方链接:SetWindowPos 函数 (winuser.h) - Win32 apps | Microsoft Learn

BOOL SetWindowPos(
  [in]           HWND hWnd,
  [in, optional] HWND hWndInsertAfter,
  [in]           int  X,
  [in]           int  Y,
  [in]           int  cx,
  [in]           int  cy,
  [in]           UINT uFlags
);

改编成C#的方法:

[DllImport("user32.dll")]
    static extern bool SetWindowPos(
IntPtr intPtr, 
int hwndInsertAfter, 
int X, 
int Y, 
int cx, 
int cy, 
uint uFlags);

备注:

如果注意看的小伙伴会问我,为什么 int hwndInsertAfter是int呢?不应该是IntPtr吗?

这个比较特殊,因为在官方文档里备注了。(如图9所示)

图9 hwndInsertAfter注解

注解的意思是:这里要填数字int

1        放在所有窗口最下面

-2       放在置顶窗口以外的第一层

0        单次置顶

-1        永远置顶 

2.参数说明

IntPtr intPtr:                     填写你想要控制的句柄   
int hwndInsertAfter:           前面讲过,按照需求填一下
int X:                                     你打算把窗口放在哪个屏幕的哪个位置中的x   
int Y:                                     你打算把窗口放在哪个屏幕的哪个位置中的y
int cx:                                    你的窗口分辨率宽(如果全屏显示,这个没有意义)
int cy:                                    你的窗口分辨率高(如果全屏显示,这个没有意义)
uint uFlags:                           功能很多(如图10所示)

图10 uFlags

你用哪个,就填写下面的数字就行了。

这次我们选择(如图11所示),意思就是,显示窗口,并且可以操作。

图11 0x0040
3.使用方法 
using System;
using System.Runtime.InteropServices;
using UnityEngine;

public class myWindowMod : MonoBehaviour
{
    [DllImport("user32.dll")]
    static extern IntPtr FindWindowExA(IntPtr hWndParent, IntPtr hWndChildAfter, string lpszClass, string lpszWindow);

    //引入设置窗口方法
    [DllImport("user32.dll")]
    static extern bool SetWindowPos(IntPtr intPtr, int hwndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);

    public string projectName;
    IntPtr intPtr;
    void Start()
    {
        intPtr = FindWindowExA(IntPtr.Zero, IntPtr.Zero, null, projectName);

        //设置窗口  //句柄   //放在位置(0,0)   //显示窗口并能操作
        SetWindowPos(intPtr, -1,0,0,1920,1080, 0x0040);
                         //永久置顶  //窗口分辨率1920,1080
    }
}

以上就是置顶窗口的全部代码!

四、作者的碎碎念

这一部分涉及到很多内容,确实不太好学,大家加油啊~

在程序这么复杂的环境下,大家也不想失去一个这么努力的把知识讲详细的up吧,多点赞,收藏,关注,就能给我能量哦~谢谢大家。

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

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

相关文章

基于Springboot的小型超市商品展销系统-计算机毕业设计源码01635

摘 要 科技进步的飞速发展引起人们日常生活的巨大变化,电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流,人类发展的历史正进入一个新时代。在现实运用中,应用软件的工作…

anaconda安装pytorch-快速上手99%可以(可以虚拟环境OR不进行虚拟环境)

一、预备工作 先检查自己是否有anaconda 在cmd里面输入conda --version查看 二、在anaconda中创建虚拟环境 1.1 打开Anaconda Prompt 1.2 进行自定义安装python 将其中的自定义地址和版本换成自己想安装的地址和版本 我这里安装的地址是E:\Anaconda\DL,python版本是3.8.3…

循环 -控制语句

循环 循环是什么 重复执行一段代码的结构。只要满足循环的条件,会一直执行这个代码。 循环条件:在一定范围之内,按照指定的次数来执行循环。 循环体:在指定的次数内执行的命令序列。只要条件满足循环体会被一直执行。 循环和…

Windows搭建nacos集群

Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件。相比Eureka功能更加丰富,在国内受欢迎程度较高。 下载地址:Tags alibaba/nacos GitHub 链接:百度网盘 请输入提取码 提取码:8888 解压文件夹 目录说明&am…

FPGA - 滤波器 - FIR滤波器设计

一,数字滤波器 滤波器是一种用来减少或消除干扰的器件,其功能是对输入信号进行过滤处理得到所需的信号。滤波器最常见的用法是对特定频率的频点或该频点以外的频率信号进行有效滤除,从而实现消除干扰、获取某特定频率信号的功能。一种更广泛的…

MyBatis 高级映射与延迟加载(分步查询)的详细内容

1. MyBatis 高级映射与延迟加载(分步查询)的详细内容 文章目录 1. MyBatis 高级映射与延迟加载(分步查询)的详细内容2. 准备工作3. 多对一 高级映射3.1 第一种方式:级联属性映射3.2 第二种方式:association…

英格索兰IngsollRang控制器过热维修讲解

【英格索兰IngsollRang控制器维修请关注】 【英格索兰IngsollRang控制器维修】 【英格索兰控制器维修】 一、IngsollRang扭矩枪控制器故障诊断 1. 检查环境温度:首先,确认工作场所的温度是否过高。如果环境温度超过设备规定的工作温度,可能…

刷代码随想录有感(102):动态规划——整数拆分

题干&#xff1a; 代码&#xff1a; class Solution { public:int integerBreak(int n) {vector<int>dp(n 1);dp[0] 0;dp[1] 0;dp[2] 1;for(int i 3; i < n; i){for(int j 1; j < i / 2; j){dp[i] max(dp[i], max((j) * (i - j), j * dp[i - j]));}}return…

JavaScript的数组(一维数组、二维数组、数组常用的方法调用)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

eclipse 老的s2sh(Struts2+Spring+Hibernate) 项目 用import导入直接导致死机(CPU100%)的解决

1、下载Apache Tomcat - Apache Tomcat 8 Software Downloads 图中是8.5.100的版本&#xff0c;下面的设置用的是另一个版本的&#xff0c;其实是一样。 2、先将Server配好&#xff0c;然后再进行导入操作。 2、选择jdk 当然&#xff0c;这里也可以直接“Download and instal…

无公网IP与服务器完成企业微信网页应用开发远程调试详细流程

文章目录 前言1. Windows安装Cpolar2. 创建Cpolar域名3. 创建企业微信应用4. 定义回调本地接口5. 回调和可信域名接口校验6. 设置固定Cpolar域名7. 使用固定域名校验 前言 本文主要介绍如何在企业微信开发者中心通过使用内网穿透工具提供的公网域名成功验证回调本地接口服务! …

Solr7.4.0报错org.apache.solr.common.SolrException

文章目录 org.apache.solr.common.SolrException: Exception writing document id MATERIAL-99598435990497269125316 to the index; possible analysis error: cannot change DocValues type from NUMERIC to SORTED_NUMERIC for field "opt_time"Exception writing…

为什么说掌握心理学知识成为产品经理一门必修课?

大家好&#xff0c;我是herosunly。985院校硕士毕业&#xff0c;现担任算法研究员一职&#xff0c;热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名&#xff0c;CCF比赛第二名&#xff0c;科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的…

uniapp地图导航

我们只需要给图标加一个点击事件 我这里的数据都是动态的&#xff0c;想测试的朋友可以写固定值 然后跳转之后首先会调到选择软件导航 点击导航之后会显示使用哪个app 最后我们选择之后将会直接跳转到app进行导航

【启明智显彩屏应用】Model3A 7寸触摸彩屏的充电桩应用方案

一、充电桩概述 &#xff08;一&#xff09;充电桩诞生背景 随着社会的进步和人们生活质量的提升&#xff0c;汽车已逐渐融入每个家庭的日常生活中。然而&#xff0c;汽车数量的激增也带来了严重的环境污染问题&#xff0c;特别是尾气排放。为了应对这一挑战&#xff0c;新能源…

Modbus协议转Profinet协议网关与气体监测系统配置案例

一、背景&#xff1b;Modbus协议和Profinet协议作为工业领域常见的两种通讯协议&#xff0c;各自具有一定的特点和应用范围。Modbus转Profinet网关&#xff08;XD-MDPN100/300&#xff09;在工业自动化控制系统中&#xff0c;可以将Modbus协议转换为Profinet协议&#xff0c;以…

认识线性调频信号(LFM)和脉冲压缩

目录 1. 线性调频&#xff08;LFM&#xff09;信号&#xff1a;2.Matlab仿真3.脉冲压缩 微信公众号获取更多FPGA相关源码&#xff1a; 1. 线性调频&#xff08;LFM&#xff09;信号&#xff1a; 在时域中&#xff0c;一个理想的线性调频信号或脉冲持续时间为T秒&#xff0c;…

加码多肤色影像技术 这是传音找到的“出海利器“?

全球化时代&#xff0c;市场竞争愈演愈烈&#xff0c;产品差异化已然成为了企业脱颖而出的关键。在黄、白肤色长期占据人像摄影主赛道的背景下&#xff0c;传音就凭借独一无二的多肤色影像技术走出非洲&#xff0c;走向了更广阔的新兴市场。 聚焦深肤色人群拍照痛点&#xff0c…

web端使用高德地图

web端使用高德地图 一、申请高德key和秘钥二、在项目中引入所需功能js、css文件三、实现地图选点、回显选点四、自定义地图 一、申请高德key和秘钥 申请高德key 申请成功后可以得到key 二、在项目中引入所需功能js、css文件 <script src"https://webapi.amap.com/m…

【复旦邱锡鹏教授《神经网络与深度学习公开课》笔记】感知器

感知器是一种非常早期的线性分类模型&#xff0c;作为一种简单的神经网络模型被提出。感知器是一种模拟生物神经元行为的机器&#xff0c;有与生物神经元相对应的部件&#xff0c;如权重&#xff08;突触&#xff09;、偏置&#xff08;阈值&#xff09;及激活函数&#xff08;…