Terminar proceso sin Ventana

Post Reply
softruz
Posts: 485
Joined: Fri Feb 09, 2007 10:34 am

Terminar proceso sin Ventana

Post 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
User avatar
JmGarcia
Posts: 654
Joined: Mon May 29, 2006 3:14 pm
Location: Madrid - ESPAÑA

Post 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
Mi abuelo decía: Los aviones vuelan porque Dios quiere, y los helicópteros ni Dios sabe porque vuelan.
FWH 16.02, xHarbour 1.2.3, Harbour 3.2.0, WorkShop 4.5, AJ Make 0.30, Borlan BCC 7.00, VisualStudio 2013
softruz
Posts: 485
Joined: Fri Feb 09, 2007 10:34 am

Re:

Post 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.
User avatar
JmGarcia
Posts: 654
Joined: Mon May 29, 2006 3:14 pm
Location: Madrid - ESPAÑA

Post 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
Mi abuelo decía: Los aviones vuelan porque Dios quiere, y los helicópteros ni Dios sabe porque vuelan.
FWH 16.02, xHarbour 1.2.3, Harbour 3.2.0, WorkShop 4.5, AJ Make 0.30, Borlan BCC 7.00, VisualStudio 2013
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post 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
);
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post 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
);
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
JmGarcia
Posts: 654
Joined: Mon May 29, 2006 3:14 pm
Location: Madrid - ESPAÑA

Post 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)
Mi abuelo decía: Los aviones vuelan porque Dios quiere, y los helicópteros ni Dios sabe porque vuelan.
FWH 16.02, xHarbour 1.2.3, Harbour 3.2.0, WorkShop 4.5, AJ Make 0.30, Borlan BCC 7.00, VisualStudio 2013
softruz
Posts: 485
Joined: Fri Feb 09, 2007 10:34 am

Re

Post 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.
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post 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.
regards, saludos

Antonio Linares
www.fivetechsoft.com
softruz
Posts: 485
Joined: Fri Feb 09, 2007 10:34 am

Re:

Post 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.
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

Como se inicia ese proceso ? Lo inicia otra aplicación ?
regards, saludos

Antonio Linares
www.fivetechsoft.com
softruz
Posts: 485
Joined: Fri Feb 09, 2007 10:34 am

rE:

Post by softruz »

Si lo inicia otra aplicacion independiente.

Un Saludo.
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post 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()
regards, saludos

Antonio Linares
www.fivetechsoft.com
Post Reply