文章目录
- [📢前言](https://cloud.tencent.com/developer)🎬
该窗口置顶
。实现该功能主要是使用了几个关键的Windows的API,分别是下面几个函数:
其中关键函数的意义和关键参数,可以到指定链接查看详细信息,这里就不多做阐述了。
辅助脚本:C.cs
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
public class C
{
public delegate bool WNDENUMPROC(IntPtr hwnd, uint lParam);
[DllImport("user32.dll", SetLastError = true)]
public static extern bool EnumWindows(WNDENUMPROC lpEnumFunc, uint lParam);
[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr GetParent(IntPtr hWnd);
[DllImport("user32.dll")]
public static extern uint GetWindowThreadProcessId(IntPtr hWnd, ref uint lpdwProcessId);
[DllImport("kernel32.dll")]
public static extern void SetLastError(uint dwErrCode);
public static IntPtr GetProcessWnd()
{
IntPtr ptrWnd = IntPtr.Zero;
uint pid = (uint)Process.GetCurrentProcess().Id; // 当前进程 ID
bool bResult = EnumWindows(new WNDENUMPROC(delegate (IntPtr hwnd, uint lParam)
{
uint id = 0;
if (GetParent(hwnd) == IntPtr.Zero)
{
GetWindowThreadProcessId(hwnd, ref id);
if (id == lParam) // 找到进程对应的主窗口句柄
{
ptrWnd = hwnd; // 把句柄缓存起来
SetLastError(0); // 设置无错误
return false; // 返回 false 以终止枚举窗口
}
}
return true;
}), pid);
return (!bResult && Marshal.GetLastWin32Error() == 0) ? ptrWnd : IntPtr.Zero;
}
}
核心脚本如下:WindowActive.cs
//公众号:呆呆敲代码的小Y
using UnityEngine;
using System.Runtime.InteropServices;
using System;
public class WindowActive : MonoBehaviour
{
[DllImport("User32.dll")]
extern static bool SetForegroundWindow(IntPtr hWnd);
[DllImport("User32.dll")]
extern static bool ShowWindow(IntPtr hWnd, short State);
[DllImport("user32.dll ")]
public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
const UInt32 SWP_NOSIZE = 0x0001;
const UInt32 SWP_NOMOVE = 0x0002;
IntPtr hWnd;
//public float Wait = 0;//延迟执行
//public float Rate = 1;//更新频率
public bool KeepForeground = true;//保持最前
void Start()
{
hWnd = C.GetProcessWnd();
Active();
//InvokeRepeating("Active", Wait, Rate);
}
/// <summary>
/// 激活窗口
/// </summary>
void Active()
{
if (KeepForeground)
{
ShowWindow(hWnd, 1);
SetForegroundWindow(hWnd);
SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
}
}
}
把这个脚本直接挂到摄像机就OK了,发布之后可以看效果,编辑模式下看不到效果。
我这里是用了一个西红柿闹钟的项目用作测试,因为之前使用该闹钟想提高自己的工作效率时发现该闹钟老是容易被其他应用程序遮挡住,所以才想到让他持续运行在屏幕最前端不被盖住,从而督促自己。
打包的时候需要注意一下Build的配置,改成Windowed模式,启用Run In background,开启Resizable Window。
此处的配置是可以让我们打包出来的应用程序可以自由调节窗口大小,且可以后台持续运行。
具体打包的配置功能可以在此文章中查阅:
Unity打包必备知识 | Player Setting 面板的 Player属性详解【重要】
此时我们点击Build,然后用电脑运行该应用程序即可。
在打包出来的文件夹中点击exe文件即可运行。
运行效果如下:
该西红柿闹钟的exe文件会一直显示在屏幕最前方不会被其他窗口盖住。