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

news2025/1/11 5:01:06

目录

前言

一、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吧,多点赞,收藏,关注,就能给我能量哦~谢谢大家。

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

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

相关文章

Java-集合类-Arrays.asList()使用需要注意的大坑

Arrays.asList使用需要注意的大坑 大坑1.不可修改列表大小&&原始数组与列表共享数据2.对于基本类型数组的使用限制 两个错误案例wrong1wrong2 ​ Arrays.asList() 是 Java 中一个常用的方法,它 用于将数组转换为列表(List)。这个方…

第2章 Rust初体验4/8:提供标准库之外功能的Library Crate:简化包管理和依赖管理:猜骰子冷热游戏

讲动人的故事,写懂人的代码 2.4 故事2: 生成点数之和的随机答案 又是新的一天,大家的培训课又开始了哦!现在,我们的学员们开始用三种语言来实现故事2,加油! 2.4.1 Rust版故事2 2.4.1.1 提供标准库之外功能的Library Crate:简化包管理和依赖管理 贾克强:“我们的故事…

配置Vue3中的baseURL--用于项目快速修改请求服务器

配置baseURL之后可以快速修改请求的服务器,在网上搜索了很多教程都没有找到合适的,大多都是对Vue2项目进行配置的和配置繁琐的,那么这里分享一下对vue3项目如何简单快速设置baseURL 1.在main.js中写上这两句话,配置默认的baseURL…

WPF视频学习-简单应用篇图书馆程序(一)

1.登录界面和主界面跳转 先把登录界面分为三行《Grid》 先添加两行&#xff1a; <Grid><!--//分三行&#xff0c;行排列--><Grid.RowDefinitions><RowDefinition Height"auto"/><RowDefinition Height"auto"/><RowDef…

【杂谈】-不同种类放大器及其区别

不同种类放大器及其区别 文章目录 不同种类放大器及其区别1、概述2、放大器种类2.1 如何衡量保真度2.2 如何测量放大器的效率 3、放大器分类3.1 A类放大器3.2 B 类放大器3.3 AB类放大器3.4 C类放大器3.5 其他放大器类别 1、概述 放大器是电子产品中最常用的电路之一。有几种类…

C# 使用 webview2 嵌入网页

需求&#xff1a;C#客户端程序, 窗口里嵌入一个web网页&#xff0c;可通过URL跳转的那种。并且&#xff0c;需要将登录的身份验证信息&#xff08;token&#xff09;设置到请求头里。 核心代码如下&#xff1a; // 打开按钮的点击事件 private void openBtn_Click(object sen…

【Python】已完美解决:executemany() takes exactly 2 positional arguments (3 given)

文章目录 一、问题背景二、可能出错的原因三、错误代码示例四、正确代码示例&#xff08;结合实战场景&#xff09;五、注意事项 已解决&#xff1a;Python中executemany()方法参数数量错误的问题 一、问题背景 在Python的数据库编程中&#xff0c;executemany()方法是一个常…

MapStruct的用法总结及示例

MapStruct是一个代码生成器&#xff0c;它基于约定优于配置的原则&#xff0c;使用Java注解来简化从源对象到目标对象的映射过程。它主要用于减少样板代码&#xff0c;提高开发效率&#xff0c;并且通过编译时代码生成来保证性能。 我的个人实践方面是在2021年前那时候在项目中…

2024/06/13--代码随想录算法(贪心)3/6|134.加油站、135.分发糖果、860.柠檬水找零、406.根据身高重建队列

134.加油站 力扣链接 class Solution:def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:curSum 0 # 当前累计的剩余油量totalSum 0 # 总剩余油量start 0 # 起始位置for i in range(len(gas)):curSum gas[i] - cost[i]totalSum gas[i] - co…

区间合并——Acwing.803区间合并

区间合并 定义 区间合并是指将一组有重叠或相邻的区间合并成一个或多个更大的区间。 运用情况 图像处理&#xff1a;在图像的区域分析中&#xff0c;可能需要将相邻的具有相似特征的区域进行合并。时间区间处理&#xff1a;比如将多个连续时间段进行合并。行程规划&#xf…

AMS深入浅出

目标&#xff1a; 1. 一、AMS启动流程 ActivityManagerService是 安卓10 以后&#xff0c;将AMS拆分出ActivityTaskManagerService。 1.1 启动入口 AMS是由SystemServer进程启动&#xff0c;在启动过程 startBootStripService&#xff0c;会启动AMS和ATMS服务。 SystemSe…

关于学习Token、JWT、Cookie等验证授权方式的总结

目录 一、为什么Cookie无法防止CSRF攻击&#xff0c;而Token可以&#xff1f; 二、为什么无论采用Cookie-session的方式&#xff0c;还是Token&#xff08;JWT&#xff09;的方式&#xff0c;在一个浏览器里&#xff0c;同一个网站只能保证一个用户处于登录状态&#xff1f; …

阻容感的串联和并联

文章目录 电阻的串联电容的串联 电阻的串联 电容的串联 CC1C2/(C1C2) 串联后电容反而变小了&#xff0c;所以实际应用中&#xff0c;电容不串联&#xff08;我没见过电容串联使用的&#xff09; 类似于电导的分压&#xff0c; 电容一般是并联使用 电感一般串联使用

【Go】用 DBeaver、db browser 和 SqlCipher 读取 SqlCipher 数据库

本文档主要描述如何用 DBeaver、db browser 和 SqlCipher 上打开加密的 SQLite3 数据库(用 SqlCipher v3 加密) 软件版本 DBeaver&#xff1a;v24.1.0 SQLite-driver: sqlite-jdbc-3.46.0.0.jar dbbrowser-for-sqlite-cipher&#xff1a;3.12.2 SqlCipher cli(ubuntun)&am…

Honor of Kings 2024.06.13 (2)

【第一局】准确的说&#xff0c;其实对面优势更加明显&#xff0c;可惜黄忠和墨子喜欢杀人&#xff0c;而我又是不喜欢杀人的&#xff0c;打了好几次失误 【第二局】阵容本来很有优势&#xff0c;这个二呆射手跟第一局黄忠一样爱杀人&#xff0c;应该说三路的输出都爱杀人&…

Golang的GC

目录 介绍GC 概要 什么是根对象 三色标记法 什么情况下三色标记法会失效 屏障机制 “强-弱” 三色不变式 插入屏障 (强三色) 删除屏障(弱三色) Go 的混合写屏障机制 混合写屏障规则 介绍GC 概要 作用范围&#xff1a;只回收堆内存&#xff0c;不回收栈内存&#xf…

Stability AI发布新版文生图模型:依然开源

Stability AI最近发布了Stable Diffusion 3 Medium&#xff08;简称SD3 Medium&#xff09;&#xff0c;这是其最新的文生图模型&#xff0c;被官方称为“迄今为止最先进的开源模型”。SD3 Medium的性能甚至超过了Midjourney 6&#xff0c;特别是在生成手部和脸部图像方面表现出…

汇聚荣科技有限公司在拼多多评价上好不好?

汇聚荣科技有限公司在拼多多平台的评价如何&#xff0c;这是很多消费者在选择购买该公司产品时会关心的问题。通过深入分析&#xff0c;我们可以从多个维度来探讨这一问题。 一、产品质量 对于任何公司而言&#xff0c;产品的质量是其生存和发展的根本。根据用户反馈和相关评价…

Python的Pillow(图像处理库)非常详细的学习笔记

Python的Pillow库是一个非常强大的图像处理库。 安装Pillow库&#xff1a; 在终端或命令行中输入以下命令来安装Pillow&#xff1a; pip install pillow 安装后查看是否安装成功以及当前版本 pip show Pillow 升级库&#xff1a; pip install pillow --upgrade 一些基…

css入门基础

目录 1. CSS前景 2.什么是CSS 3.CSS发展史 4.CSS的3种样式格式 5.CSS 的语法 6.CSS的字体样式 7.选择器类型 8.CSS外观属性 1. CSS前景 从HTML被发明开始&#xff0c;样式就以各种形式存在。不同的浏览器结合它们各自的样式语言为用户提供页面效果的控制。最初的HTML只…