DeviceLostException во время нажатия клавиш CTRL ALT DEL в Direct3D с использованием C # - PullRequest
1 голос
/ 30 апреля 2011

Я использую ссылки Microsoft.DirectX и Microsoft.DirectX.Direct3D для рисования в моей форме. Пока я запускаю программу, и пользователь нажимает CTRL ALT DEL в Windows XP и вызывает форму «Безопасность 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 Ответ

3 голосов
/ 30 апреля 2011

2 вещи в 4 точках:

  • Вы не должны использовать Microsoft.DirectX, он устарел в течение долгого времени.Взгляните на SlimDX или SharpDX.
  • Чтобы заново создать ваше устройство, вам сначала нужно подождать , пока устройство не будет восстановлено
  • Когда устройство может быть восстановленоПосле восстановления необходимо освободить все объекты видеопамяти и воссоздать их.
  • Вы вызываете метод Reset.
...