11import 'dart:io' ;
2+ import 'package:flutter/material.dart' ;
23import 'package:flutter/services.dart' ;
34import 'package:flutter/foundation.dart' ;
45import 'package:window_manager/window_manager.dart' ;
@@ -15,39 +16,7 @@ Future<void> landScape() async {
1516 } else if (Platform .isAndroid || Platform .isIOS) {
1617 await AutoOrientation .landscapeAutoMode (forceSensor: true );
1718 } else if (Platform .isMacOS || Platform .isWindows || Platform .isLinux) {
18- await windowManager.setHasShadow (false ); // 去掉阴影
19- await windowManager.setAsFrameless (); // 设置为无边框模式
20- await windowManager.setFullScreen (true );
21- // 1. 獲取目前視窗的中心點
22- Rect windowRect = await windowManager.getBounds ();
23- Offset center = windowRect.center;
24-
25- // 2. 獲取所有顯示器
26- List <Display > displays = await screenRetriever.getAllDisplays ();
27-
28- // 3. 尋找視窗中心點在哪個顯示器範圍內
29- Display currentDisplay = displays.firstWhere ((display) {
30- // 注意:這裡使用 visiblePosition 或 bounds.topLeft
31- final Offset origin = display.visiblePosition ?? Offset .zero;
32- final Size size = display.size;
33-
34- return center.dx >= origin.dx &&
35- center.dx <= origin.dx + size.width &&
36- center.dy >= origin.dy &&
37- center.dy <= origin.dy + size.height;
38- }, orElse: () => displays.first);
39-
40- // 4. 根據找到的螢幕設定全螢幕範圍
41- await windowManager.setBounds (
42- Rect .fromLTWH (
43- currentDisplay.visiblePosition! .dx,
44- currentDisplay.visiblePosition! .dy,
45- currentDisplay.size.width,
46- currentDisplay.size.height,
47- ),
48- );
49-
50- await windowManager.setAlwaysOnTop (false );
19+ await doEnterWindowFullScreen ();
5120 }
5221 } catch (exception, stacktrace) {
5322 debugPrint (exception.toString ());
@@ -64,38 +33,7 @@ Future<void> doEnterFullScreen() async {
6433 if (Platform .isAndroid || Platform .isIOS) {
6534 await SystemChrome .setEnabledSystemUIMode (SystemUiMode .immersiveSticky);
6635 } else {
67- await windowManager.setHasShadow (false ); // 去掉阴影
68- await windowManager.setAsFrameless (); // 设置为无边框模式
69- await windowManager.setFullScreen (true );
70- // 1. 獲取目前視窗的中心點
71- Rect windowRect = await windowManager.getBounds ();
72- Offset center = windowRect.center;
73-
74- // 2. 獲取所有顯示器
75- List <Display > displays = await screenRetriever.getAllDisplays ();
76-
77- // 3. 尋找視窗中心點在哪個顯示器範圍內
78- Display currentDisplay = displays.firstWhere ((display) {
79- // 注意:這裡使用 visiblePosition 或 bounds.topLeft
80- final Offset origin = display.visiblePosition ?? Offset .zero;
81- final Size size = display.size;
82-
83- return center.dx >= origin.dx &&
84- center.dx <= origin.dx + size.width &&
85- center.dy >= origin.dy &&
86- center.dy <= origin.dy + size.height;
87- }, orElse: () => displays.first);
88-
89- // 4. 根據找到的螢幕設定全螢幕範圍
90- await windowManager.setBounds (
91- Rect .fromLTWH (
92- currentDisplay.visiblePosition! .dx,
93- currentDisplay.visiblePosition! .dy,
94- currentDisplay.size.width,
95- currentDisplay.size.height,
96- ),
97- );
98- await windowManager.setAlwaysOnTop (false );
36+ await doEnterWindowFullScreen ();
9937 }
10038}
10139
@@ -122,3 +60,38 @@ Future<void> doExitFullScreen() async {
12260 debugPrint (stacktrace.toString ());
12361 }
12462}
63+
64+ Future <void > doEnterWindowFullScreen () async {
65+ // 1. 先彻底移除装饰和阴影
66+ await windowManager.setHasShadow (false );
67+ await windowManager.setAsFrameless ();
68+ // 建议增加:隐藏标题栏,防止 Windows 11 顶部出现细线
69+ await windowManager.setTitleBarStyle (TitleBarStyle .hidden, windowButtonVisibility: false );
70+
71+ Rect windowRect = await windowManager.getBounds ();
72+ Offset center = windowRect.center;
73+ List <Display > displays = await screenRetriever.getAllDisplays ();
74+
75+ Display currentDisplay = displays.firstWhere ((display) {
76+ final Offset origin = display.visiblePosition ?? Offset .zero;
77+ final Size size = display.size;
78+ return center.dx >= origin.dx &&
79+ center.dx <= origin.dx + size.width &&
80+ center.dy >= origin.dy &&
81+ center.dy <= origin.dy + size.height;
82+ }, orElse: () => displays.first);
83+
84+ final double x = currentDisplay.visiblePosition! .dx.floorToDouble ();
85+ final double y = currentDisplay.visiblePosition! .dy.floorToDouble ();
86+ final double width = currentDisplay.size.width.ceilToDouble ();
87+ final double height = currentDisplay.size.height.ceilToDouble ();
88+
89+ await windowManager.setBounds (Rect .fromLTWH (x, y, width, height));
90+
91+ if (Platform .isWindows) {
92+ await windowManager.setBackgroundColor (Colors .black);
93+ }
94+
95+ await windowManager.setFullScreen (true );
96+ await windowManager.setAlwaysOnTop (false );
97+ }
0 commit comments