Модератор: Mikle
Хм... А зачем тебе блокировать??? А если я нажму кнопочку Windows или Windows + D? Если появляются глюки, то лучше их корректно обработать...Odrick писал(а):Народ, подскажите как во время работы программы, которая юзает DirectX глобально блакировать сочетание клавиш Alt+Tab
Select Case DirectDraw7.TestCooperativeLevel
Case DIGFFS_DEVICELOST:
' действия при потере устройства
Case ' а вот тут надо подбирать и выполнять действия для восстановления:
End Select
Я бы не делал. Есть функции DirectDraw7.RestoreAllSurfaces, DirectDrawSurface7.isLost и DirectDrawSurface7.restore . В конце концов, есть такая игрушка StarCraft на directdraw - сворачивается+ восстанавливается без проблемсов .... и поверхностей там не меньше...Odrick писал(а):Vovik это я прекрасно знаю Но в том то и сложность - что нужно делать для восстановления? Не пересоздавать же все поверхности и устройства! Тем более, что не извесно, где именно юзверю вздумаеться переключиться на другой процесс. А у нас довольно большое количество поверхностей - около 2000, которые генерятся в зависимости от экрана. И отслеживать, что именно сейчас юзается... Нет уж, легче заблокировать возможность переключения в принципе. Хм... А не попробовать ли сделать основное окно системно-модальным? Ваше мнение?
Выкладывай... не обещаю, что смогу помочь, но я постораюсь.... Мне вот интересно, а Юрич с этим не работал? Хотелось бы услышать его мнение.Odrick писал(а):Vovik RestoreAllSurfaces выдает ошибку... Сегодня выложу простейший код, который работает по тому же принципу, что и основная прога. Посмотришь куда и как правильно впихнуть эти функции?
Option Explicit
Dim dx As New DirectX7
Dim dd As DirectDraw7
Dim rcRect As RECT
Dim ddsd1 As DDSURFACEDESC2
Dim ddsd2 As DDSURFACEDESC2
Dim Primary As DirectDrawSurface7
Dim Back As DirectDrawSurface7
Dim BackPic As DirectDrawSurface7
Private Sub Form_Load()
Dim bLoop As Boolean
Set dd = dx.DirectDrawCreate("")
Me.Show
Call dd.SetCooperativeLevel(Me.hWnd, DDSCL_FULLSCREEN Or DDSCL_EXCLUSIVE)
Call dd.SetDisplayMode(640, 480, 16, 0, DDSDM_DEFAULT)
ddsd1.lFlags = DDSD_CAPS Or DDSD_BACKBUFFERCOUNT
ddsd1.ddsCaps.lCaps = DDSCAPS_PRIMARYSURFACE Or DDSCAPS_FLIP Or DDSCAPS_COMPLEX
ddsd1.lBackBufferCount = 1
Set Primary = dd.CreateSurface(ddsd1)
Dim caps As DDSCAPS2
caps.lCaps = DDSCAPS_BACKBUFFER
Set Back = Primary.GetAttachedSurface(caps)
ddsd2.lFlags = DDSD_CAPS
ddsd2.ddsCaps.lCaps = DDSCAPS_OFFSCREENPLAIN
ddsd2.lHeight = 480
ddsd2.lWidth = 640
Set BackPic = dd.CreateSurfaceFromFile("Back.bmp", ddsd2)
rcRect.Left = 0
rcRect.Top = 0
rcRect.Right = 640
rcRect.Bottom = 480
bLoop = True
Do While bLoop
Back.BltFast 0, 0, BackPic, rcRect, DDBLTFAST_NOCOLORKEY Or DDBLTFAST_WAIT
Primary.Flip Nothing, DDFLIP_WAIT
DoEvents
Loop
End Sub
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyEscape Then
Set BackPic = Nothing
Set Back = Nothing
Set Primary = Nothing
Call dd.RestoreDisplayMode
Call dd.SetCooperativeLevel(Me.hWnd, DDSCL_NORMAL)
End
End If
End Sub
Function ExModeActive() As Boolean
Dim Res As Long
ExModeActive = False
Res = DD.TestCooperativeLevel
Select Case Res
Case DD_OK: ExModeActive = True
Case DDERR_NOEXCLUSIVEMODE: DoEvents
Case DDERR_SURFACELOST: DD.RestoreAllSurfaces
End Select
End Function
Odrick писал(а):Да, я эту проблему решил уже точно таким же способом... Только код ошибки я получал при прорисовке спрайта. Что-то типа:
nErr = Back.BltFast( бла, бла, бла...)
Так работает вполне нормально. Вот ссылка на то, что у меня вышло:
http://bbs.vbstreets.ru/viewtopic.php?t ... ht=alt+tab
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 20