【发布时间】:2019-09-06 10:25:52
【问题描述】:
我尝试过 Flutter Windows 桌面应用程序,但我无法隐藏标题栏以在全屏模式窗口中运行应用程序
【问题讨论】:
标签: flutter
我尝试过 Flutter Windows 桌面应用程序,但我无法隐藏标题栏以在全屏模式窗口中运行应用程序
【问题讨论】:
标签: flutter
遇到了同样的问题,我在这里分享我的解决方案。
我不是 Win32 开发人员,但我设法通过这种方式制作了基本的全屏。
此代码适用于我的 Flutter 版本 1.21.0-10.0.pre.114,我希望它也适用于您。
我的解决方案深受这个启发:https://stackoverflow.com/a/2416613/14093885
你必须编辑 ./windows/runner/main.cpp
在第 30 行左右的这些语句之间插入以下代码:
window.SetQuitOnClose(true);
//Insert Code Here
run_loop.Run();
要插入的代码:
//HWND is window handler
HWND hwnd = window.GetHandle();
auto windowHDC = GetDC(hwnd);
int fullscreenWidth = GetDeviceCaps(windowHDC, DESKTOPHORZRES);
int fullscreenHeight = GetDeviceCaps(windowHDC, DESKTOPVERTRES);
int colourBits = GetDeviceCaps(windowHDC, BITSPIXEL);
int refreshRate = GetDeviceCaps(windowHDC, VREFRESH);
DEVMODE fullscreenSettings;
bool isChangeSuccessful;
EnumDisplaySettings(NULL, 0, &fullscreenSettings);
fullscreenSettings.dmPelsWidth = fullscreenWidth;
fullscreenSettings.dmPelsHeight = fullscreenHeight;
fullscreenSettings.dmBitsPerPel = colourBits;
fullscreenSettings.dmDisplayFrequency = refreshRate;
fullscreenSettings.dmFields = DM_PELSWIDTH |
DM_PELSHEIGHT |
DM_BITSPERPEL |
DM_DISPLAYFREQUENCY;
SetWindowLongPtr(hwnd, GWL_EXSTYLE, WS_EX_APPWINDOW | WS_EX_TOPMOST);
SetWindowLongPtr(hwnd, GWL_STYLE, WS_POPUP | WS_VISIBLE);
SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, fullscreenWidth, fullscreenHeight, SWP_SHOWWINDOW);
isChangeSuccessful = ChangeDisplaySettings(&fullscreenSettings, CDS_FULLSCREEN) == DISP_CHANGE_SUCCESSFUL;
ShowWindow(hwnd, SW_MAXIMIZE);
编辑 - 颤振 2:
根据@Pavel,最后一行ShowWindow(hwnd, SW_MAXIMIZE); 在 Flutter 2 中是不需要的。
【讨论】:
window,我认为应该没问题。无论如何,我不是 win32 开发人员,所以如果不是这样,我的方法可能已经过时了。
ShowWindow(hwnd, SW_MAXIMIZE);
我猜window_manager可以满足你的需求
将此添加到您的包的 pubspec.yaml 文件中:
dependencies:
window_manager:
git:
url: https://github.com/leanflutter/window_manager.git
ref: main
// Enter fullscreen
await WindowManager.instance.setFullScreen(true);
// Level fullscreen
await WindowManager.instance.setFullScreen(false);
【讨论】:
目前还没有对全屏模式的内置支持,因此没有可调用的 Dart API 进入全屏模式。如果您熟悉 Win32 编程,您可以直接更改 Runner 代码以使窗口全屏,也可以编写一个插件来实现。
【讨论】:
需要实现插件window_size:https://github.com/google/flutter-desktop-embedding/tree/master/plugins/window_size
@override initState() {
super.initState();
Future.delayed(Duration.zero).then((finish) async {
if (Platform.isMacOS) {
// * FULL SCREEN
PlatformWindow window = await getWindowInfo();
setWindowFrame(Rect.fromLTWH(0, 0, window.screen.frame.width, window.screen.frame.height));
}
});
}
【讨论】:
我认为它现在必须更改 cpp 文件。
win32_window.cpp 将“WS_OVERLAPPEDWINDOW”替换为“WS_POPUP | WS_MAXIMIZE”
/* WS_POPUP : 没有标题栏 WS_MAXIMIZE:全屏 */
【讨论】:
这是更多帮助的链接window Size 我已经这样做了 我从这里得到窗口大小: https://docs.microsoft.com/en-us/windows/win32/winmsg/window-styles
在 Flutter Windows 应用程序中获取窗口大小: 去 windows/runner/win32_window.cpp
在 win32_window.cpp 文件中找到下面给出的 CODE 并根据需要进行更改。
HWND window = CreateWindow(
window_class, title.c_str(), WS_OVERLAPPEDWINDOW | WS_MAXIMIZE | WS_VISIBLE,
Scale(origin.x, scale_factor), Scale(origin.y, scale_factor),
Scale(size.width, scale_factor), Scale(size.height, scale_factor),
nullptr, nullptr, GetModuleHandle(nullptr), this);
【讨论】:
使用这个包:https://github.com/leanflutter/window_manager
在您的 main 中,在“RunApp”之后添加此代码:
WidgetsFlutterBinding.ensureInitialized();
// Must add this line.
await windowManager.ensureInitialized();
// Use it only after calling `hiddenWindowAtLaunch`
windowManager.waitUntilReadyToShow().then((_) async {
// Hide window title bar
await windowManager.setTitleBarStyle('hidden');
await windowManager.setFullScreen(true);
await windowManager.center();
await windowManager.show();
await windowManager.setSkipTaskbar(false);
});
【讨论】: