Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Ctrl-alt-del en XP pro

Iniciado por Pogacha, 03 de Mayo de 2008, 05:42:44 PM

« anterior - próximo »

Pogacha

¿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

Titonus

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

Pogacha

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

[EX3]

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...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Pogacha

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

[EX3]

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...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.