使用C#在Direct3D中的CTRL ALT DEL期间发生DeviceLostException

时间:2011-04-29 22:23:53

标签: c# exception-handling windows-xp directx direct3d

我正在使用Microsoft.DirectX和Microsoft.DirectX.Direct3D引用在我的表单上做一些绘图。当我运行该程序并且用户在Windows XP中按下CTRL ALT DEL并显示“Windows安全”表单时,返回到表单时,抛出了一个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,则试图重置设备是没有意义的。

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

1 个答案:

答案 0 :(得分:3)

4分中有2件事:

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