【问题标题】:Mono winforms app fullscreen in Ubuntu?Mono winforms 应用程序在 Ubuntu 中全屏显示?
【发布时间】:2011-02-18 21:07:13
【问题描述】:

只是想知道是否有已知的方法可以让 Mono System.Windows.Forms 应用程序在 Ubuntu/Gnome 上全屏显示。

单声道是 2.4.2.3 Ubuntu 是 9.10

在 Windows 上执行此操作需要 pinvoke,显然无法在这里工作。

这是我将窗口边框设置为无,窗口位置设置为中心,状态设置为最大化:

alt text http://dl.dropbox.com/u/116092/misc/permalink/joggler/screenshot01.png

更新。

也试过了:

  • this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
    this.WindowState = System.Windows.Forms.FormWindowState.Maximized;

  • CTRL-F11

  • 文本 = string.Empty; // 没有标题
    最大化框 = 假;
    最小化框 = 假;
    控制框 = 假;
    FormBorderStyle = 无;
    WindowState = 最大化;

  • FormBorderStyle = FormBorderStyle.None;
    位置 = 新点 (0, 0);
    大小 = Screen.PrimaryScreen.Bounds.Size;

所有这些我都会得到相同的结果。

我遇到了一个涉及到 _NET_WM_STATE_FULLSCREEN 的 pinvoke 的线索,但就我所知。任何关于此的指针将不胜感激。

【问题讨论】:

  • 这是一个边缘案例,祝你好运。
  • 是的,这就是我问的原因:-)
  • 如果您最终选择 _NET_WM_STATE_FULLSCREEN 路线,请参阅下面的答案。

标签: winforms ubuntu mono fullscreen window-managers


【解决方案1】:

以下工作:

(灵感来自这里:https://bugzilla.xamarin.com/show_bug.cgi?id=40997

1) sudo apt-get install wmctrl

2) 在您的代码中:

Form form = new MainWindow();
form.FormBorderStyle = FormBorderStyle.None;
form.WindowState = FormWindowState.Maximized;

form.Load += (s, e) => {
    Process process = new Process {
        StartInfo = new ProcessStartInfo {
            FileName = "wmctrl",
            Arguments = $"-r :ACTIVE: -b add,fullscreen",
            CreateNoWindow = true
        }
    };
    process.Start();
    process.WaitForExit();
};

Application.Run(form);

【讨论】:

  • 虽然 :ACTIVE: 在 VirtualBox 上为我工作,但在 Ubuntu 平板电脑上却不工作。我将 :ACTIVE: 替换为窗口标题(窗体的文本属性)并且有效。
  • 谢谢!要是我还拥有 8 年前的硬件就好了 ;-)
【解决方案2】:

我已经被这个问题困扰了 2 天,最后我得到了解决方案: 单击左侧工具栏上的第一个图标并搜索 compizconfig 程序。转到首选项->统一,您会看到左侧有一个统一插件的勾号。删除该勾号,您将看到顶部菜单栏消失。 虽然这个线程很老,但我仍然希望我能帮助任何遇到这个问题并寻求帮助的人。

【讨论】:

    【解决方案3】:

    您需要在 ubuntu 中禁用视觉效果。

    编辑: 并确保您的表单大小至少是无边框的屏幕分辨率。如果边框在设计时,并且您要在代码中删除它们,您将需要 1030x796 之类的东西来实现 1024x768 显示。

    【讨论】:

      【解决方案4】:

      _NET_WM_STATE_FULLSCREEN 将摆脱边界。 GNOME 面板仍会出现。

      根据以下帖子,秘诀是摆脱最小/最大尺寸,以便窗口管理器自行调整大小:

      http://linux.derkeiler.com/Mailing-Lists/GNOME/2010-01/msg00035.html

      这里有一些关于原生规范的文档:

      http://standards.freedesktop.org/wm-spec/wm-spec-latest.html

      http://www.x.org/docs/ICCCM/icccm.pdf

      要直接与 X 窗口系统对话,您必须调用 XLib。为了发送像 _NET_WM_STATE_FULLSCREEN 这样的东西,你必须有一个指向窗口和显示器的指针。

      我不知道如何找到显示器,但我可以提供指向窗口的指针。在 X 上运行时,Form.Handle 属性应该是指向 X 窗口的指针。

      【讨论】:

      • 我对 Mono 源进行了一些搜索,但没有调用 _NET_WM_STATE_FULLSCREEN。我很自在地说没有完全托管的方法可以使用 Mono 将正确的窗口提示发送到窗口管理器。您当然可以使用 GTK#,因为它在下面使用 GTK+,而 gtk_window_fullscreen() 可以满足您的需求。
      【解决方案5】:
      【解决方案6】:

      我现在已经通过设置面板的自动隐藏属性来解决这个问题。

      不理想,因为它取决于用户改变他们的环境来使用我的应用程序,但总比没有好。

      【讨论】:

      • 您是手动还是在代码中执行此操作?如果是后者,我想你总是可以在你的应用程序获得焦点时切换它。这样,您将获得整个屏幕,但所有其他应用程序都按预期运行,并且系统在您完成时保持原样。当然,您需要检查初始状态以确保它尚未自动隐藏。这应该像你想要的那样工作,即使它感觉很恶心。
      【解决方案7】:

      不确定您所说的“全屏”是什么意思 - 但我已经编写了几个占据屏幕且没有单个 PInvoke 的 Windows.Forms 应用程序。

      这是我配置主表单的方式...

      Text = string.Empty; // No caption
      MaximizeBox = false;
      MinimizeBox = false;
      ControlBox = false;
      FormBorderStyle = None;
      WindowState = Maximized;
      

      可选,

      TopMost = true;
      

      希望这会有所帮助。

      【讨论】:

      【解决方案8】:

      我目前无法测试,但您尝试过简单的调整大小吗?

      form.FormBorderStyle = FormBorderStyle.None
      form.Location = Point(0, 0)
      form.Size = Screen.PrimaryScreen.Bounds.Size
      

      【讨论】:

      • 另一个在 Windows 上运行良好但结果与上面第二个屏幕截图相同。
      【解决方案9】:

      应该可以使用“CTRL+F11”热键以全屏模式显示在 gnome 中运行的每个应用程序。

      也许你可以试试

      System.Windows.Forms.SendKeys.Send();
      

      但这只是一个猜测,我没有运行 atm 的 Linux 来尝试这个。但也许这会有所帮助。

      【讨论】:

        【解决方案10】:

        你试过了吗?

          this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;             
            this.WindowState = System.Windows.Forms.FormWindowState.Maximized;
        

        很遗憾,我现在没有可用的 Ubuntu,但我可以在旧单声道版本中看到旧补丁...

        【讨论】:

        • 不幸的是,它没有越过屏幕顶部的任务栏(更新后的屏幕截图)
        • 好的 - 然后尝试找到相关的 C 调用以全屏显示。调用本机 C 函数也可以在 Mono 下工作。如果您在这方面有问题,请告诉我,但我过去曾这样做过。
        • 嗯,Google 带回了 _NET_WM_STATE_FULLSCREEN。看起来有用吗?
        • 是的 - 但我没有找到函数调用所需的其他参数。
        猜你喜欢
        • 2010-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多