UWP应用开发:如何隐藏窗口标题栏控件 实现指定分辨率窗口化全屏
隐藏标题栏控件解决方案
方案1:内置API配置(优先尝试)
在你现有创建窗口的代码中补充以下配置即可直接隐藏所有标题栏控件:
private async void CreateWindow() { var window = await AppWindow.TryCreateAsync(); window.RequestSize(new Size(500, 500)); window.TitleBar.ExtendsContentIntoTitleBar = true; // 新增配置开始 // 隐藏三个系统控制按钮的交互和显示 window.TitleBar.IsMinimizable = false; window.TitleBar.IsMaximizable = false; window.TitleBar.IsClosable = false; // 完全折叠标题栏区域,不留任何预留高度 window.TitleBar.PreferredHeightOption = TitleBarHeightOption.Collapsed; // 新增配置结束 PublicScreenFrame = new Frame(); ElementCompositionPreview.SetAppWindowContent(window, PublicScreenFrame); await window.TryShowAsync(); }
该方案是WinUI/WinAppSDK官方提供的标准实现,大部分场景下可以完全清除标题栏相关元素。
方案2:Win32 API Hack(兼容性最强)
如果内置API无法满足需求,直接通过修改窗口底层样式强制移除标题栏及所有控制按钮,步骤如下:
- 先引入Win32互操作相关声明:
using System.Runtime.InteropServices; [DllImport("user32.dll")] private static extern uint GetWindowLongPtr(IntPtr hWnd, int nIndex); [DllImport("user32.dll")] private static extern uint SetWindowLongPtr(IntPtr hWnd, int nIndex, uint dwNewLong); [DllImport("user32.dll")] private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
- 在创建窗口后添加样式修改逻辑:
// 获取窗口句柄 var hwnd = WinRT.Interop.WindowNative.GetWindowHandle(window); const int GWL_STYLE = -16; const uint WS_CAPTION = 0x00C00000; // 标题栏样式 const uint WS_SYSMENU = 0x00080000; // 系统菜单(含关闭按钮) const uint WS_THICKFRAME = 0x00040000; // 可调边框 const uint WS_MINIMIZEBOX = 0x00020000; // 最小化按钮 const uint WS_MAXIMIZEBOX = 0x00010000; // 最大化按钮 // 移除所有和标题栏、控制按钮相关的样式 uint currentStyle = GetWindowLongPtr(hwnd, GWL_STYLE); currentStyle &= ~(WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX); SetWindowLongPtr(hwnd, GWL_STYLE, currentStyle); // 使样式修改立即生效 SetWindowPos(hwnd, IntPtr.Zero, 0, 0, 0, 0, 0x0001 | 0x0002 | 0x0020);
该方案直接操作窗口底层属性,不受上层UI框架限制,100%可以移除所有标题栏相关元素。
窗口化全屏实现方案
如果需要让窗口在指定大屏上以指定分辨率无黑边显示,直接调用MoveAndResize方法设置窗口坐标和大小即可:
// 示例1:自适应大屏分辨率全屏 // 获取所有连接的显示器,索引1对应第二块外接大屏 var targetDisplay = DisplayService.GetDisplays()[1]; var displayArea = DisplayArea.GetFromDisplayId(targetDisplay.DisplayId); // 窗口铺满整个大屏 window.MoveAndResize(displayArea.OuterBounds); // 示例2:自定义分辨率显示 // 先获取大屏的左上角坐标,保证窗口落在大屏范围内 var displayPos = displayArea.OuterBounds; // 设置为你需要的500x500分辨率,位置在大屏左上角 window.MoveAndResize(new RectInt32(displayPos.X, displayPos.Y, 500, 500));
如果配合上述Win32样式修改方案使用,最终生成的窗口没有任何边框、标题栏、控制按钮,完全符合大屏驱动的捕获要求。
内容的提问来源于stack exchange,提问作者Pakoco
相关产品推荐
相关产品推荐

