Page 1 of 1

Traer al frente - primer plano

Posted: Fri Aug 09, 2024 2:55 pm
by FiveWiDi
Hola a todos,

Estoy intentando que un programa FWH sólo se pueda 'arrancar' una vez. Y lo consigo.

En las siguientes usos, consigo detectar que está funcionando.

Y buscando entre las ventanas de windows por su título consigo su Hwnd.

Cómo puedo traer al frente esa ventana de la que tengo su Hwnd ?

He buscado en el foro 'traer al fente' 'primer plano' y no encuentro la solución.

He probado con:

-SetFocus( oWnd:hWnd )
-BringWindowToTop( oWnd:hWnd )
-SetWindowPos(oWnd:hWnd,-1,,,,,8)

Pero no funciona.

Muchas gracias,

Re: Traer al frente - primer plano

Posted: Fri Aug 09, 2024 3:17 pm
by paquitohm
Hola,

Quizás SetForegroundWindow() sea la funcion más adecuada

https://forums.fivetechsupport.com/view ... e63#p42310

Salu2

Re: Traer al frente - primer plano

Posted: Fri Aug 09, 2024 3:19 pm
by karinha

Code: Select all | Expand

   IF ISEXERUNNING( CFILENAME( HB_ARGV( 0 ) ) )

      MsgInfo( "WinOrcam.exe Já Está Rodando Nesta Máquina","TuPrograma.exe")

      SHOWWINDOW( FINDWINDOW( 0, "TUPROGRAMA" ), 9 )

      SETFOREGROUNDWINDOW( FINDWINDOW( 0, "TUPROGRAMA" ) )

      __QUIT()

      RETURN NIL

   ENDIF
 
Regards, saludos.

Re: Traer al frente - primer plano

Posted: Fri Aug 09, 2024 3:31 pm
by cmsoft
Puedes probar con

Code: Select all | Expand

function WndOnTop( lState, hWnd )

   local nRet := 0

   DEFAULT hWnd := GetActiveWindow()

   if !lState
      nRet = AcpOnTop( hWnd, -2, 0, 0, 0, 0, 3 )
   else
      nRet = AcpOnTop( hWnd, -1, 0, 0, 0, 0, 3 )
   endif

return nRet

dll32 static function AcpOnTop( hWnd AS LONG, hWndInsertAfter AS LONG, x AS LONG, y AS LONG, cx AS LONG, cy AS LONG, wFlags AS LONG ) ;
      AS LONG PASCAL  FROM "SetWindowPos" LIB "User32.dll"
 

Re: Traer al frente - primer plano

Posted: Fri Aug 09, 2024 4:22 pm
by FiveWiDi
PERFECTO!!!!!!

Ha funcionado con SetForegroundWindow().

Muchas gracias,

Re: Traer al frente - primer plano

Posted: Sat Aug 10, 2024 12:53 pm
by JoseAlvarez
Saludos...

Para evitar que mi aplicación se ejecute más de una vez yo uso esto:

Code: Select all | Expand

if IsExeRunning( ("nombre.exe") )
  MsgInfo( "No puedes abrir dos veces el programa",'Error...')
    release all
    quit
endif
 

Re: Traer al frente - primer plano

Posted: Sat Aug 10, 2024 4:47 pm
by FiveWiDi
JoseAlvarez wrote:Saludos...

Para evitar que mi aplicación se ejecute más de una vez yo uso esto:

Code: Select all | Expand

if IsExeRunning( ("nombre.exe") )
  MsgInfo( "No puedes abrir dos veces el programa",'Error...')
    release all
    quit
endif
 
Si, yo también uso esta manera.
Pero incluso evito que modifiquen el fichero .EXE así:

If IsExeRunning(cFileName(GetModuleFileName(GetInstance()))) // cFileName(HB_ARGV(0))
...

Muchas gracias,

Re: Traer al frente - primer plano

Posted: Sun Aug 11, 2024 8:15 pm
by JoseAlvarez
Excelente! Esa no me la sabía

Gracias!