¿Como puedo determinar si el usuario apreto CTRL-ALT-DEL en XP pro?
El problema es que cuando se presiona esto y el dialogo de seguridad de windows XP aparece el device se pierde, y puede ser en cualquier punto de ejecucion del programa.
Con IsIconic() o GetActiveWindow() puedo tener cierta información pero quisiera poder distinguir exactamente la pantalla de seguridad de en verdad una perdida de foco o minimización.
Cualquier aporte se agradecera enormemente.
Saludos
Creo que tendrás que montarte una función Hook para obtener ese tipo de combinación de teclas en Windows.
En el enlace tienes toda la información: http://msdn.microsoft.com/en-us/library/ms644959(VS.85).aspx
OK, gracias.
Para el hook, tienen que tomar en cuenta ctrl-alt-del y alt-ctrl-del ;)
Pero esto no soluciono todos los conflictos que tenia :(
Encontré la solución, así que voy a compartirla con ustedes.
El problema era que la aplicación se colgaba cuando entraba en la ventana de dialogo de seguridad de windows XP por llamadas invalidas al api de D3D cuando el foco se habia perdido.
Luego de entender el problema podia detectar cuando el device se perdia, y así evitar el cuelge y responder adecuadamente, pero lamentablemente no podia detectar cuando un error en verdad ocurria.
La solución fue agregar un par de TestCooperativeLevel en el caso de una excepción en una llamada a la api de D3D.
Esto funcionaba bastante bien pero lamentablemente TestCooperativeLevel no sirve en modo fullscreen, por una razón que desconozco me devolvia un error constantemente por mas que el foco volviera a la ventana.
En definitiva, las solución fue ignorar al SDK de microsoft y manterner en funcionamiento el Proc de la ventana en el bucle del TestCooperativeLevel()
Cita de: "SDK de DX7"
Full-screen applications
Full-screen applications receive the DDERR_NOEXCLUSIVEMODE return value if they lose exclusive device access–for example, if the user pressed ALT+TAB to switch away from the current application. In this case, applications might call TestCooperativeLevel in a loop, exiting only when the method returns DD_OK (meaning that exclusive mode was returned). In the body of the loop, the application should relinquish control of the CPU to prevent using cycles unnecessarily. Windows supports functions such as the WaitMessage or Sleep Win32 functions for this purpose.
Con esto el problema se soluciona los problemas de funcionamiento, lo unico malo es que en el task manager la aplicación figura como "no responde". Igual hasta aqui llego que para el usuario es lo importante.
Saludos
Dijeras en Direct3D8 y 9 lo entenderia, es un calvario hasta que logras implementar una recuperacion de device, pero en DirectDraw7/Direct3D7?:
Private Function ExModeActive() As Boolean
On Error GoTo ErrOut
Dim TestCoopRes As Long
TestCoopRes = DirectDraw.TestCooperativeLevel
ExModeActive = (TestCoopRes = DD_OK)
ErrOut:
End Function
'Esto nos guardará de intentar 'Blitear' en caso de que perdamos las superficies (alt-tab)
BRestore = False
Do Until ExModeActive
DoEvents
BRestore = True
Loop
DoEvents
If BRestore Then
BRestore = False
Call DirectDraw.RestoreAllSurfaces()
End If
Este codigo lo usaba antaño cuando programaba en DirectDraw, que por entonces solo programa a pantalla completa (no era tan facil desarrollar codigo para ventana y fullscreen como en D3D8/9) y nunca me ha dado problemas en el reseteo de device.
Salu2...
OK, gracias.
Supongo que el DoEvents es reponder a los mensajes de windows.
OK, me costo por que en el SDK no dice nada acerca de esto, hace suponer que el bucle solo debe hacer el TestCooperativeLevel y un Sleep()
Saludos
Cita de: "Pogacha"Supongo que el DoEvents es reponder a los mensajes de windows.
Eso mismo :)
Cita de: "Pogacha"me costo por que en el SDK no dice nada acerca de esto
En la doc de DirectX7 no recuerdo pero el de DirectX8 la doc es un poco escueta referente al tema del reseteo y recuperacion de device. Toca obligadamente a surfear en Google o jugar a prueba y error para implementarlo correctamente.
Salu2...