【问题标题】:Is there any option to Run Flutter Windows Desktop application in full screen mode是否有任何选项可以在全屏模式下运行 Flutter Windows 桌面应用程序
【发布时间】:2019-09-06 10:25:52
【问题描述】:

我尝试过 Flutter Windows 桌面应用程序,但我无法隐藏标题栏以在全屏模式窗口中运行应用程序

【问题讨论】:

    标签: flutter


    【解决方案1】:

    遇到了同样的问题,我在这里分享我的解决方案。

    我不是 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 中是不需要的。

    【讨论】:

    • 当我尝试这个时,颤振模拟器冻结了。你确定这只是粘贴代码的问题吗?
    • 我不确定这取决于您使用的颤振版本。如果它是我使用的那个应该可以工作,但得知它随着颤振 2.0 而改变我不会感到惊讶。如果您使用良好的window,我认为应该没问题。无论如何,我不是 win32 开发人员,所以如果不是这样,我的方法可能已经过时了。
    • @Tunnelvisie 如果您使用的是 Flutter 2,请删除此行:ShowWindow(hwnd, SW_MAXIMIZE);
    【解决方案2】:

    我猜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);
    

    【讨论】:

    • 这是目前最完美的一个
    【解决方案3】:

    目前还没有对全屏模式的内置支持,因此没有可调用的 Dart API 进入全屏模式。如果您熟悉 Win32 编程,您可以直接更改 Runner 代码以使窗口全屏,也可以编写一个插件来实现。

    【讨论】:

      【解决方案4】:

      需要实现插件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));
        }
      });
      

      }

      【讨论】:

      • 该代码将为您提供一个与屏幕大小相同的装饰窗口。仍然会有标题栏、调整大小手柄、菜单栏等。这和全屏模式不一样。
      【解决方案5】:

      我认为它现在必须更改 cpp 文件。

      win32_window.cpp 将“WS_OVERLAPPEDWINDOW”替换为“WS_POPUP | WS_MAXIMIZE”

      /* WS_POPUP : 没有标题栏 WS_MAXIMIZE:全屏 */

      【讨论】:

        【解决方案6】:

        这是更多帮助的链接window Size 我已经这样做了 我从这里得到窗口大小: https://docs.microsoft.com/en-us/windows/win32/winmsg/window-styles

        在 Flutter Windows 应用程序中获取窗口大小: 去 windows/runner/win32_window.cpp

        • 对于没有标题栏的全屏窗口 WS_POPUP | WS_VISIBLE
        • 用于带有标题栏的全屏窗口(没有任何图标,例如 关闭、最小化、恢复、徽标) WS_MAXIMIZE | WS_VISIBLE
        • 用于小窗口或自定义窗口 WS_OVERLAPPEDWINDOW | WS_VISIBLE
        • 用于带有标题栏的全屏窗口 WS_OVERLAPPEDWINDOW | WS_MAXIMIZE | WS_VISIBLE

        在 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);
        

        【讨论】:

          【解决方案7】:

          使用这个包: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);
          });
          

          【讨论】:

            猜你喜欢
            • 2020-12-05
            • 1970-01-01
            • 2012-01-03
            • 2023-04-04
            • 2015-11-21
            • 1970-01-01
            • 2012-09-22
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多