Focos entre aplicaciones

Miguel ngel
05 de Noviembre del 2004
Hola,

Tengo un GRAN problema. Tengo una aplicación y cuando se desconecta un dispositivo, se carga un formulario en forma de mensaje que lo indica. Hasta aquí correcto. Cuando ejecuto la aplicación y tengo el foco en la aplicación del formulario, se muestra correctamente. El problema viene cuando le hago un click sobre otra aplicación que debe ser modal, y entonces desactivo el dispositivo. Como el formulario se debería cargar en la zona que ocupa la aplicación modal, no se muestra. Como puedo hacer para que, sin descargar la aplicación modal, se muestre un formulario de otra aplicación que ocupa la zona de la aplicación? Muchas Gracias.

Miguel Ángel.

en?
05 de Noviembre del 2004
hola,
lo siento pero no acabo de entender el problema.
Si no te sabe mal, podrías replantearlo?


Saludos.

Miguel ngel
05 de Noviembre del 2004
Intento explicarme mejor :-)

A ver, vamos al caso concereto; en una misma pantalla tengo en ejecución 2 aplicaciones, pongamos 1 en la mitad izquierda y otra en la mitad derecha. La aplicación de la izquierda está en modal siempre. Entonces, de la aplicacion de la derecha, cuando se desconecta un dispositivo USB, se lanza un mensaje por pantalla. Este mensaje, es parecido a un msgbox, solo que lo hemos hecho como un formulario independiente, que cuando se produce el evento pues se carga. (Se produce el evento --> frmMsgBox.Show, vbmodal) ok? entonces, que ocurre?

Pongamos que el mensaje este sale por la parte izquierda de la pantalla, que es donde está la otra aplicación que es modal siempre. Cuando tenemos el foco en la aplicación de la derecha, que es de donde se produce el mensaje, este aparece correctamente (se sobrepone a lo que haya en la aplicacion de la izquierda); pero cuando el foco lo tiene el de la izquierda (por ejemplo, clicamos sobre algun elemento de la aplicación de la izquierda), no se ve el mensaje. Porqué? porque aparece por debajo de la pantalla de la aplicación...

Hemos perdido ya bastante dinero por este problema, y estamos bloqueados. Hemos hecho soluciones alternativas, pero no es plan.

Gracias.

en?
05 de Noviembre del 2004
pues tranquilo, no seguirás perdiendo dinero por esta tontería ;-)

Para que la ventana se ponga encima de todas las que hay habiertas, y que además siga siendo vbModal, la solución está en utilizar la función «SetWindowPos» de la API de Windows:

· En la sección 'declaraciones' del formulario 'frmMsgBox' pegas esto:

'***********************
Private Declare Sub SetWindowPos Lib "User32" (ByVal hWnd As Long, _
ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, _
ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long)

Const HWND_TOPMOST = -1
Const HWND_NOTOPMOST = -2
Const SWP_NOSIZE = &H1
Const SWP_NOMOVE = &H2
Const SWP_SHOWWINDOW = &H40

Private Sub Form_Activate()
SetWindowPos Me.hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_SHOWWINDOW Or SWP_NOMOVE Or SWP_NOSIZE
' El parámetro HWND_TOPMOST hace que esta ventana sea del estilo 'AlwaysOnTop', siempre encima de todas.
' Si no quieres que lo sea deja activada la siguiente instrucción.
'SetWindowPos Me.hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_SHOWWINDOW Or SWP_NOMOVE Or SWP_NOSIZE
End Sub
'***********************

Si necesitas información de los parámetros o no entiendes algo puedes preguntar.

Saludos.