Alt + Tab

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

Odrick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 503
Зарегистрирован: 28.09.2003 (Вс) 2:04

Alt + Tab

Сообщение Odrick » 23.05.2005 (Пн) 16:12

Народ, подскажите как во время работы программы, которая юзает DirectX глобально блакировать сочетание клавиш Alt+Tab
То, что для одних константа, для других только переменная...

ne_tapka
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 13.04.2005 (Ср) 23:03

Сообщение ne_tapka » 23.05.2005 (Пн) 16:29

Odrick
интересный вопрос.

вот такая мысль:
отслеживаешь GetAsyncKeyState нажатие клавиши Alt, и тут же эмулируешь нажатие клавиши Ctrl (keyb_event если я не ошибаюсь)

не уверен что сработает, но кто знает.. я не пробовал

Odrick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 503
Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 23.05.2005 (Пн) 16:47

Ну как вариант... Ладно, попробую. Спасибо.
То, что для одних константа, для других только переменная...

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Re: Alt + Tab

Сообщение Vovik » 23.05.2005 (Пн) 16:48

Odrick писал(а):Народ, подскажите как во время работы программы, которая юзает DirectX глобально блакировать сочетание клавиш Alt+Tab
Хм... А зачем тебе блокировать??? А если я нажму кнопочку Windows или Windows + D? Если появляются глюки, то лучше их корректно обработать... :roll:

Odrick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 503
Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 23.05.2005 (Пн) 16:54

С этим я согласен полностью. В принципе в том то и проблема. Этот вопрос я уже давно задавал, но вразумительного ответа так и не услышал. Проблема банальна - после сворачивания-разворачивания не восстанавливается изображение. Изображение строится на DirectDraw. Как с этим бороться? Кроме как блокировать все возможные сворачивания в голову ничего не приходит. Если кто знает - подскажите :) Переходить на Direct3D не предлагать :) Движок написан на DirectDraw и переписывать его - на пару месяцев затянеться... Шкурка вычинки не стоит :)
То, что для одних константа, для других только переменная...

RADIST(vb2ar23)
Новичок
Новичок
Аватара пользователя
 
Сообщения: 46
Зарегистрирован: 28.04.2005 (Чт) 14:06

Сообщение RADIST(vb2ar23) » 23.05.2005 (Пн) 17:18

Ctrl+Alt+Del и Alt+Tab
'ВАРИАНТ 1

Private Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, lpvParam As Any, ByVal fuWinIni As Long) As Long
Private Const SPI_SCREENSAVERRUNNING = 97&
Public Sub AllowKeys(bParam As Boolean)
Dim lRetVal As Long, bOld As Boolean
lRetVal = SystemParametersInfo(SPI_SCREENSAVERRUNNING, bParam, bOld, 0&)
End Sub
Private Sub Form_Load()
Call AllowKeys(True) 'блокировка сочетаний
End Sub
Private Sub Form_Unload(Cancel As Integer)
Call AllowKeys(False) 'разблокировка сочетаний
End Sub

'ВАРИАНТ 2

'без дополнительной подпрограммы
'Добавьте два элемента CommandButton. Первая кнопка блокирует сочетание клавиш, вторая - разрешает.
Const SPI_SCREENSAVERRUNNING = 97
Private Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" _
(ByVal uAction As Long, ByVal uParam As Long, ByVal lpvParam As Any, ByVal fuWinIni As Long) As Long
Private Sub Command1_Click()
Call SystemParametersInfo(SPI_SCREENSAVERRUNNING, True, "1", 0)
End Sub
Private Sub Command2_Click()
Call SystemParametersInfo(SPI_SCREENSAVERRUNNING, False, "1", 0)
End Sub
Private Sub Form_Unload(Cancel As Integer)
Call SystemParametersInfo(SPI_SCREENSAVERRUNNING, False, "1", 0)
End Sub

Источник VBNet.RU

Odrick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 503
Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 23.05.2005 (Пн) 23:32

Хм... Спасибо! Попробую :)
То, что для одних константа, для других только переменная...

ne_tapka
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 13.04.2005 (Ср) 23:03

Сообщение ne_tapka » 24.05.2005 (Вт) 0:47

RADIST(vb2ar23)
в Win 2003 не пашет

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 24.05.2005 (Вт) 7:25

Odrick Надо рыть в этом направлении:
Код: Выделить всё
  Select Case DirectDraw7.TestCooperativeLevel
    Case DIGFFS_DEVICELOST:
       ' действия при потере устройства
    Case ' а вот тут надо подбирать и выполнять действия для восстановления:     
  End Select

Помнится, мы поднимали этот вопрос, но для Direct3D8. А с DirectDraw я уже давно не балуюсь... :roll:

Odrick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 503
Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 24.05.2005 (Вт) 9:22

Vovik это я прекрасно знаю :) Но в том то и сложность - что нужно делать для восстановления? Не пересоздавать же все поверхности и устройства! Тем более, что не извесно, где именно юзверю вздумаеться переключиться на другой процесс. А у нас довольно большое количество поверхностей - около 2000, которые генерятся в зависимости от экрана. И отслеживать, что именно сейчас юзается... Нет уж, легче заблокировать возможность переключения в принципе. Хм... А не попробовать ли сделать основное окно системно-модальным? Ваше мнение?
То, что для одних константа, для других только переменная...

ne_tapka
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 13.04.2005 (Ср) 23:03

Сообщение ne_tapka » 24.05.2005 (Вт) 11:18

Odrick
Ну в любой NT системе ctrl+alt+del ничто не остановит, может стоит забить на это?
напиши в рид ми мол акуратнее юзеры, не жмите чё попало..
хотя alt-tab совместимые игры радуют однозначно)

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 24.05.2005 (Вт) 16:23

Odrick писал(а):Vovik это я прекрасно знаю :) Но в том то и сложность - что нужно делать для восстановления? Не пересоздавать же все поверхности и устройства! Тем более, что не извесно, где именно юзверю вздумаеться переключиться на другой процесс. А у нас довольно большое количество поверхностей - около 2000, которые генерятся в зависимости от экрана. И отслеживать, что именно сейчас юзается... Нет уж, легче заблокировать возможность переключения в принципе. Хм... А не попробовать ли сделать основное окно системно-модальным? Ваше мнение?
Я бы не делал. Есть функции DirectDraw7.RestoreAllSurfaces, DirectDrawSurface7.isLost и DirectDrawSurface7.restore :roll: . В конце концов, есть такая игрушка StarCraft на directdraw - сворачивается+ восстанавливается без проблемсов .... и поверхностей там не меньше... :roll:
P.S. может эти функции и не тормозные, кто тебе сказал, что он не отресторит 2000 поверхностей!? Ты пробовал? :?

Odrick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 503
Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 24.05.2005 (Вт) 16:42

Vovik RestoreAllSurfaces выдает ошибку... Сегодня выложу простейший код, который работает по тому же принципу, что и основная прога. Посмотришь куда и как правильно впихнуть эти функции?
То, что для одних константа, для других только переменная...

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 24.05.2005 (Вт) 22:37

Odrick писал(а):Vovik RestoreAllSurfaces выдает ошибку... Сегодня выложу простейший код, который работает по тому же принципу, что и основная прога. Посмотришь куда и как правильно впихнуть эти функции?
Выкладывай... не обещаю, что смогу помочь, но я постораюсь.... :roll: Мне вот интересно, а Юрич с этим не работал? Хотелось бы услышать его мнение.

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 24.05.2005 (Вт) 23:39

смотри SDK, там рабочие примеры востановления после потери девайса. Блокировать кнопки - имхо - глупо, все-таки медиа программа, а не вирус какой-нить. Или... :roll:
ХЎ

Odrick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 503
Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 24.05.2005 (Вт) 23:51

Ну дык конечно глупо! И это не вирус, есстесно :) Игруха пишется: http://www.lasersquad.h15.ru. Если можно это сделать нормально, то я только за! В общем вот простейший код, который, однако, работает на тих же принципах, что и основная прога:
Код: Выделить всё
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


Плюс вот проект:
У вас нет доступа для просмотра вложений в этом сообщении.
То, что для одних константа, для других только переменная...

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 24.05.2005 (Вт) 23:56

посмотрел сайт, очень даже приличное качество! желаю удачи!

а проект смотреть не буду - лень :D
ХЎ

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 25.05.2005 (Ср) 13:20

Могу предложить вариант - переделать игру из полноэкранного режима в оконный, развернутый на весь экран. Это несколько снизит быстродействие, но в DD это уже не актуально.
Делаешь форму BorderStyle=None, WindowState=Maximized.
Пока я не знал, как восстанавливать контекст, я так делал в D3D.

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 22.08.2005 (Пн) 23:38

Начал рыть в этом нарпавлении и вот, что вышло:
Код: Выделить всё

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
    DDERR_NOEXCLUSIVEMODE – этот код возврата означает, что наша программа потеряла эксклюзивный режим. Произойти такое может, если мы flip'уем в цикле по таймеру, а пользователь зачем-то ушел из нашей программы, свернув ее или нажав Alt-TAB. В таком случае, чтобы зря не тратить процессорные циклы, лучше подождать его возвращения, вызывая функцию Sleep(0) или WaitMessage.
    DDERR_SURFACELOST – потеря Surface'ов пользователь уходил, но вернулся, Surface'ы нужно забрать назад, вызвав IDirectDraw4.RestoreAllSurfaces, содержимое их придется восстановить.

но почему-то DDERR_SURFACELOST - не срабатывает :roll: , как-будто все нормально с поверхностями :shock: ... хм... Кстати, как обрубить вертикальную синхронизацию?

Odrick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 503
Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 23.08.2005 (Вт) 11:32

Да, я эту проблему решил уже точно таким же способом... Только код ошибки я получал при прорисовке спрайта. Что-то типа:

nErr = Back.BltFast( бла, бла, бла...)

Так работает вполне нормально. Вот ссылка на то, что у меня вышло:

http://bbs.vbstreets.ru/viewtopic.php?t ... ht=alt+tab
То, что для одних константа, для других только переменная...

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 23.08.2005 (Вт) 15:02

Odrick писал(а):Да, я эту проблему решил уже точно таким же способом... Только код ошибки я получал при прорисовке спрайта. Что-то типа:

nErr = Back.BltFast( бла, бла, бла...)

Так работает вполне нормально. Вот ссылка на то, что у меня вышло:

http://bbs.vbstreets.ru/viewtopic.php?t ... ht=alt+tab

Все понятно... Так тоже можно... Но я еще покапаюсь.... А как отрубить вертикальную синхронизацию? :roll:

Odrick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 503
Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 23.08.2005 (Вт) 15:33

Да, эт интересный вопрос... Что, никто не знает? ;)
То, что для одних константа, для других только переменная...

Odrick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 503
Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 26.08.2005 (Пт) 14:54

О, вроде так: при флипе основной поверхности это можно указать:

Primary.Flip Nothing, DDFLIP_WAIT & DDFLIP_NOVSYNC
То, что для одних константа, для других только переменная...

Odrick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 503
Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 26.08.2005 (Пт) 15:01

Кстати, кто может внятно объяснить суть этой синхронизации а также, почему во всех примерах приводится именно DDFLIP_WAIT (впрочем, ожидание также приводится и при выводе спрайтов). Почему не использовать вывод без ожидания? Чем это чревато?
То, что для одних константа, для других только переменная...


Вернуться в Мультимедиа

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

    TopList