gpt4 book ai didi

.net - 是什么导致 Windows 在此 WPF 功能区应用程序中挂起

转载 作者:行者123 更新时间:2023-12-03 20:32:51 25 4
gpt4 key购买 nike

我们在一个相当大且复杂的桌面应用程序中遇到了一些问题,其中将 Microsoft Ribbon 用于 WPF(或与之连接的事物的组合)会导致计算机挂起。

下面的精简代码似乎在许多计算机上触发了 Windows 挂起情况。有些计算机每次都会遇到这种挂起,有些则永远不会遇到。在某些计算机上,挂起会使整个 session 锁定(包括 num lock 和 caps lock),但在其他计算机上,鼠标仍然会移动(num lock 仍然无法使用)。当计算机无响应时,远程登录和网络共享等功能似乎仍然有效,但无法结束控制台 session 。

简而言之,似乎是行为的根本原因是以下几件事的结合:

  • WPF 的 Microsoft 功能区
  • 在 ElementHost 中托管 WPF 控件的 Windows 窗体应用程序
  • 使用双缓冲 Windows 窗体(通过使用 CreateParams)
  • WPF功能区上软件渲染的使用

  • 我们后来通过使用 WS_EX_COMPOSITED 解决了这个问题。仅在几个选定的表格上,但我非常想发现这个问题的根本原因。

    我还没有找到一种直接的方法来重现挂起,但是这个最小的应用程序似乎可以完成业务,至少在某些机器上,通过做一些最大化/恢复并将鼠标悬停在功能区按钮上方。

    以下代码编译为 x86 .NET 4.0,针对 Microsoft WPF Ribbon .NET 4.0 库。

    using System;
    using System.Windows.Forms;
    using Microsoft.Windows.Controls.Ribbon;
    using System.Windows.Interop;
    using System.Windows.Forms.Integration;

    namespace WindowsRibbonHang
    {
    public class Form1 : Form
    {
    protected override CreateParams CreateParams
    {
    get
    {
    CreateParams cp = base.CreateParams;
    cp.ExStyle |= 0x02000000; // Turn on WS_EX_COMPOSITED
    return cp;
    }
    }

    public Form1()
    {
    Ribbon ribbon = new Ribbon();

    RibbonTab tab = new RibbonTab { Header = "FooTab" };
    ribbon.Items.Add(tab);

    RibbonSplitButton button = new RibbonSplitButton { Label = "FooButton" };
    tab.Items.Add(button);

    ElementHost elementHost = new ElementHost
    {
    Dock = DockStyle.Fill,
    Child = ribbon,
    };

    Controls.Add(elementHost);
    Dock = DockStyle.Fill;

    ribbon.Loaded += (sender, args) => {
    HwndSource hwndSource = System.Windows.PresentationSource.FromVisual(ribbon) as HwndSource;
    HwndTarget hwndTarget = hwndSource.CompositionTarget;
    hwndTarget.RenderMode = RenderMode.SoftwareOnly;
    };
    }
    }

    static class Program
    {
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());
    }
    }
    }

    最佳答案

    尝试检查受影响计算机上的图形驱动程序是否是最新的。 WPF 的工作方式与传统的 GDI 代码非常不同,因此有时不可靠的驱动程序会导致您描述的那种问题。

    关于.net - 是什么导致 Windows 在此 WPF 功能区应用程序中挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17473857/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com