使用 C# 在 Direct3D 中执行 CTRL ALT DEL 期间出现 DeviceLostException

发布于 2024-11-04 04:53:16 字数 1317 浏览 3 评论 0原文

我正在使用 Microsoft.DirectX 和 Microsoft.DirectX.Direct3D 引用在我的表单上进行一些绘图。当我运行程序并且用户在 Windows XP 中按 CTRL ALT DEL 并调出“Windows Security”表单时,当返回到表单时,会引发 DeviceLostException ,并且在尝试处理此异常时似乎没有办法把它拿回来。

我对这个问题做了一些研究,并尝试了几种编码解决方案。

        try
        {
             _d3ddevice.Present();                 
        }
        catch 
        {
            DeviceLost = true;
        }

        if (DeviceLost) 
        {
            AttemptRecovery();
        }

        this.Invalidate();
        ReadKeyboard();

        base.OnPaint(e);          

    }    

    private void AttemptRecovery()
    {
        try
        {
            _d3ddevice.TestCooperativeLevel();
        }
        catch (DeviceLostException)
        {
            Application.Exit();
        }
        catch (DeviceNotResetException)
        {
            try
            {
                _d3ddevice.Reset(_params);
                DeviceLost = false;

                InitGraphics();
                CameraPositioning();
                VertexDeclaration();
                IndicesDeclaration();         
            }
            catch (DeviceLostException)
            {
            }
        }
    }

当程序调用 TestCooperativeLevel() 时,它会在线表示,如果再次捕获 DeviceLostException,则尝试重置设备是没有意义的。

我该如何重置设备并继续在表单中绘图?

I am using the Microsoft.DirectX and Microsoft.DirectX.Direct3D references to do some drawing on my form. While I am running the program and the user presses CTRL ALT DEL in Windows XP and brings up the "Windows Security" form, when returning back to the Form, a DeviceLostException is thrown and when trying to handle this exception there seems to be no way to get it back.

I have done a little research into the matter and have tried several coding solutions.

        try
        {
             _d3ddevice.Present();                 
        }
        catch 
        {
            DeviceLost = true;
        }

        if (DeviceLost) 
        {
            AttemptRecovery();
        }

        this.Invalidate();
        ReadKeyboard();

        base.OnPaint(e);          

    }    

    private void AttemptRecovery()
    {
        try
        {
            _d3ddevice.TestCooperativeLevel();
        }
        catch (DeviceLostException)
        {
            Application.Exit();
        }
        catch (DeviceNotResetException)
        {
            try
            {
                _d3ddevice.Reset(_params);
                DeviceLost = false;

                InitGraphics();
                CameraPositioning();
                VertexDeclaration();
                IndicesDeclaration();         
            }
            catch (DeviceLostException)
            {
            }
        }
    }

When the program calls TestCooperativeLevel(), it said online if it catches the DeviceLostException again that there is no point in trying to reset the device.

What can I do to reset the device and continue drawing in my form?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

高跟鞋的旋律 2024-11-11 04:53:16

4 点中的 2 件事:

  • 你不应该使用 Microsoft.DirectX,它已经被弃用了很长一段时间。请查看 SlimDX 或 SharpDX。
  • 为了重新创建您的设备,您首先必须等待直到设备可以恢复。
  • 当设备可以恢复时,您必须释放所有视频内存对象,然后重新创建它们。
  • 您调用 Reset 方法。

2 things in 4 points :

  • You shouldn't use Microsoft.DirectX, it's deprecated since a long, long time. Check out SlimDX or SharpDX instead.
  • In order to re-create your device, you first have to wait until the device can be restored
  • When the device can be restored, you have to free all video-memory objects, and recreate them.
  • You call the Reset method.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文