Page 1 of 1

Terminar proceso sin Ventana

Posted: Fri Jul 04, 2008 2:37 pm
by softruz
Muy buenas, estoy intentando para la ejecucion de un proceso con la funcion GetModuleHandle pero solo me devuelve el handle de los procesos que tienen window, entonces ¿Hay alguna funcion que me devuelve el handle de un proceso sin window¿d

Un Saludo

Posted: Fri Jul 04, 2008 8:39 pm
by JmGarcia
Este codigo te da los procesos con ventana...

Code: Select all

local aNombres:={},hWnd:=GETWINDOW(GETDESKTOPWINDOW(),GW_CHILD)
WHILE hWnd != 0 
   cTitle:=alltrim(GETWINDOWTEXT(hWnd))
   if cTitle<>""
      if IsWindowVisible(hWnd) .and. GETWINDOW(hWnd,GW_OWNER)==0 .and. cTitle<>"Program Manager"
        aadd(aNombres,cTitle)
      endif
   endif
   hWnd:=GETWINDOW(hWnd,GW_HWNDNEXT) 
ENDDO
y este todos...

Code: Select all

local aNombres:={},hWnd:=GETWINDOW(GETDESKTOPWINDOW(),GW_CHILD)
WHILE hWnd != 0 
   cTitle:=alltrim(GETWINDOWTEXT(hWnd))
   if cTitle<>""
       aadd(aNombres,cTitle)
   endif
   hWnd:=GETWINDOW(hWnd,GW_HWNDNEXT) 
ENDDO
Para que salgan todos solo tienes que quitar el if IsWindowVisible(hWnd) .and. GETWINDOW(hWnd,GW_OWNER)==0

Re:

Posted: Sat Jul 05, 2008 5:18 pm
by softruz
Muy buenas, antetodo gracias, ahora como puedo terminar la aplicacion si solo se como se llama el ejecutable y no como se llama la ventana, es decir, como puedo enlazarlos con la funcion TerminateApp, solo necesito el nombre del ejecutable al que está unido este proceso.

Un Saludo.

Posted: Sun Jul 06, 2008 10:44 am
by JmGarcia
La variable hWnd es el handle del proceso... pasaselo a la función

TerminateApp(hWnd,<nMode>)

<nMode>
UAE_BOX 0 Display the Application Error message box and then ends the task
NO_UAE_BOX 1 Does not display the Application Error message box

Posted: Sun Jul 06, 2008 12:29 pm
by Antonio Linares
hWnd es el handle de una ventana, no el identificador de un proceso que es lo que requiere TerminateProcess():

BOOL TerminateProcess(
HANDLE hProcess, // handle to the process
UINT uExitCode // exit code for the process
);

Posted: Sun Jul 06, 2008 12:30 pm
by Antonio Linares
A partir de un handle de ventana puedes obtener el handle de su aplicación usando:

DWORD GetWindowThreadProcessId(
HWND hWnd, // handle of window
LPDWORD lpdwProcessId // address of variable for process identifier
);

Posted: Sun Jul 06, 2008 12:33 pm
by Antonio Linares

Posted: Sun Jul 06, 2008 5:40 pm
by JmGarcia
Un poco de código a partir de que ya tengamos el hWnd, podria ser...

Una vez obtenido el hWnd ¿ sería algo asi ?

Code: Select all

GetWindowThreadProcessId(hWnd,@hProcess)
TerminateApp(hProcess,0)

Re

Posted: Sun Jul 06, 2008 6:48 pm
by softruz
Muy buenas, he probado el código pero no me cierra el proceso no se si es problema de las funciones que tengo, me podreis poner la funcion GetWindowThreadProcessId y como utilizar TerminateApp.

Por que las que yo tengo no me cierra el proceso.

Un Saludo.

Posted: Mon Jul 07, 2008 10:15 am
by Antonio Linares
Si solo tienes el nombre del ejecutable, entonces la función GetModuleHandle( cNombreAplicacion ) te devuelve el handle de la aplicación.

Con ese handle llamas a TerminateProcess( nHandle, 0 ) y así podrías terminar la aplicación.

Re:

Posted: Mon Jul 07, 2008 10:19 am
by softruz
Muy buenas, es ese el problema que tenía al principio con GetModuleHandle( cNombreAplicacion ) solo me devuelve le handle de los procesos con ventana pero los procesos sin ventana no me devuelve el handle, entonces pense en recoger el handle de todos los procesos y así tener el handle del proceso, pero con GETWINDOW(hWnd,GW_HWNDNEXT) solo me devuelve el handle pero ese es de la ventana y no del proceso en si, ¿como podría coger el handle del proceso y terminarlo?

Un Saludo.

Posted: Mon Jul 07, 2008 10:21 am
by Antonio Linares
Como se inicia ese proceso ? Lo inicia otra aplicación ?

rE:

Posted: Mon Jul 07, 2008 11:05 am
by softruz
Si lo inicia otra aplicacion independiente.

Un Saludo.

Posted: Mon Jul 07, 2008 12:38 pm
by Antonio Linares
Si la otra aplicación usa ShellExecute() para ejecutarla, dicha función devuelve el handle de instancia de la aplicación ejecutada, que es el que podrás usar para terminarla más adelante usando TerminateProcess()