Como saber el proceso en ejecución?
- jrestojeda
- Posts: 543
- Joined: Wed Jul 04, 2007 3:51 pm
- Location: Buenos Aires - Argentina
Como saber el proceso en ejecución?
Hola a todos...
Estoy levantando los procesos en ejecución con la función GetTasks(), lo hace correctamente, pero con los datos que me regresa, no sé cual es el nombre del ejecutable asociado a ese proceso.
Ejemplo:
La función me regresa entre mis procesos esto:
"¡Bienvenido a Facebook en Español! - Windows Internet Explorer"
Yo al detectar la palabra "FACEBOOK" lo que quiero hacer es cerrar ese proceso. Pero si bien se que es detectada la palabra entre los procesos, no sé con esa información cual es el ejecutable. En este caso: "IEXPLORE.EXE"
Si lo abren con otro navegador detectaría la palabra pero el ejecutable sería el de ese otro navegador:
Ejemplo:
"¡Bienvenido a Facebook en Español (España)! - Mozilla Firefox" En este caso es "FIREFOX.EXE"
Lo que quiero hacer es con la llamada de TaskKill matar ese proceso, pero al no saber el nombre del PROCESO.exe no se a quien matar.
Dicho más simple, hay forma de saber para cada proceso que me regresa GetTasks() cual es el Ejecutable asociado en la lista de tareas??
Desde ya muchas gracias.
Saludos, Esteban.
Estoy levantando los procesos en ejecución con la función GetTasks(), lo hace correctamente, pero con los datos que me regresa, no sé cual es el nombre del ejecutable asociado a ese proceso.
Ejemplo:
La función me regresa entre mis procesos esto:
"¡Bienvenido a Facebook en Español! - Windows Internet Explorer"
Yo al detectar la palabra "FACEBOOK" lo que quiero hacer es cerrar ese proceso. Pero si bien se que es detectada la palabra entre los procesos, no sé con esa información cual es el ejecutable. En este caso: "IEXPLORE.EXE"
Si lo abren con otro navegador detectaría la palabra pero el ejecutable sería el de ese otro navegador:
Ejemplo:
"¡Bienvenido a Facebook en Español (España)! - Mozilla Firefox" En este caso es "FIREFOX.EXE"
Lo que quiero hacer es con la llamada de TaskKill matar ese proceso, pero al no saber el nombre del PROCESO.exe no se a quien matar.
Dicho más simple, hay forma de saber para cada proceso que me regresa GetTasks() cual es el Ejecutable asociado en la lista de tareas??
Desde ya muchas gracias.
Saludos, Esteban.
Ojeda Esteban Eduardo.
Buenos Aires - Argentina.
FWH - PellesC - DBF/CDX - ADS - Gloriosos .Bat - MySql - C# .net - FastReport
Skype: jreduojeda
Buenos Aires - Argentina.
FWH - PellesC - DBF/CDX - ADS - Gloriosos .Bat - MySql - C# .net - FastReport
Skype: jreduojeda
- jrestojeda
- Posts: 543
- Joined: Wed Jul 04, 2007 3:51 pm
- Location: Buenos Aires - Argentina
Re: Como saber el proceso en ejecución?
Ojeda Esteban Eduardo.
Buenos Aires - Argentina.
FWH - PellesC - DBF/CDX - ADS - Gloriosos .Bat - MySql - C# .net - FastReport
Skype: jreduojeda
Buenos Aires - Argentina.
FWH - PellesC - DBF/CDX - ADS - Gloriosos .Bat - MySql - C# .net - FastReport
Skype: jreduojeda
- jrestojeda
- Posts: 543
- Joined: Wed Jul 04, 2007 3:51 pm
- Location: Buenos Aires - Argentina
Re: Como saber el proceso en ejecución?
Ojeda Esteban Eduardo.
Buenos Aires - Argentina.
FWH - PellesC - DBF/CDX - ADS - Gloriosos .Bat - MySql - C# .net - FastReport
Skype: jreduojeda
Buenos Aires - Argentina.
FWH - PellesC - DBF/CDX - ADS - Gloriosos .Bat - MySql - C# .net - FastReport
Skype: jreduojeda
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Re: Como saber el proceso en ejecución?
Eduardo,
la función GetTasks() usaba la función GetModuleFileName() que te devolvería exactamente lo que necesitas, lo que ocurre es que en 32 bits ya no funciona igual que en 16 bits. Es por esto que cambiamos GetTasks() para que devolviese el titulo de la ventana, que como bien explicas no sirve exactamente para lo que necesitas.
La solución es modificar la función GetTasks() (source\function\GetTasks.prg) y usar la función GetModuleFileNameEx():
http://msdn.microsoft.com/en-us/library ... S.85).aspx
Vamos a implementarla y te mostramos aqui su código.
la función GetTasks() usaba la función GetModuleFileName() que te devolvería exactamente lo que necesitas, lo que ocurre es que en 32 bits ya no funciona igual que en 16 bits. Es por esto que cambiamos GetTasks() para que devolviese el titulo de la ventana, que como bien explicas no sirve exactamente para lo que necesitas.
La solución es modificar la función GetTasks() (source\function\GetTasks.prg) y usar la función GetModuleFileNameEx():
http://msdn.microsoft.com/en-us/library ... S.85).aspx
Vamos a implementarla y te mostramos aqui su código.
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Re: Como saber el proceso en ejecución?
Necesitamos usar la función EnumChildWindows() asi que la implementamos:
http://msdn.microsoft.com/en-us/library ... S.85).aspx
Un ejemplo de uso de esta función sería:
http://msdn.microsoft.com/en-us/library ... S.85).aspx
Code: Select all
static PHB_ITEM pCodeBlock = NULL, pParam = NULL;
static BOOL CALLBACK EnumChildProc( HWND hWnd, LPARAM lParam )
{
PHB_ITEM pNumber = hb_itemPutNL( NULL, ( LONG ) hWnd );
if( pParam )
hb_evalBlock( pCodeBlock, pNumber, pParam, NULL );
else
hb_evalBlock1( pCodeBlock, pNumber );
hb_itemRelease( pNumber );
return TRUE;
}
HB_FUNC( ENUMCHILDWINDOWS )
{
pCodeBlock = hb_param( 2, HB_IT_BLOCK );
pParam = hb_param( 3, HB_IT_NUMERIC );
hb_retl( EnumChildWindows( ( HWND ) hb_parnl( 1 ), EnumChildProc, hb_parnl( 2 ) ) );
pCodeBlock = NULL;
pParam = NULL;
}
Code: Select all
EnumChildWindows( GetDesktopWindow(), { | hWnd | AddTask( hWnd ) } )
- jrestojeda
- Posts: 543
- Joined: Wed Jul 04, 2007 3:51 pm
- Location: Buenos Aires - Argentina
Re: Como saber el proceso en ejecución?
Antonio...
Antes que nada, muchas gracias por la respuesta.
Creé un nuevo PRG al proyecto con lo siguiente:
Por un lado me salen estos Warnings:
Por otro lado al enlazar me dice que me falta la función ADDTASK()
Desde ya muchas gracias.
Saludos Esteban.
Antes que nada, muchas gracias por la respuesta.
Creé un nuevo PRG al proyecto con lo siguiente:
Code: Select all
#pragma BEGINDUMP
#include <windows.h>
#include "hbapi.h"
static PHB_ITEM pCodeBlock = NULL, pParam = NULL;
BOOL CALLBACK EnumChildProc( HWND hWnd, LPARAM lParam )
{
PHB_ITEM pNumber = hb_itemPutNL( NULL, ( LONG ) hWnd );
if( pParam )
hb_evalBlock( pCodeBlock, pNumber, pParam, NULL );
else
hb_evalBlock1( pCodeBlock, pNumber );
hb_itemRelease( pNumber );
return TRUE;
}
HB_FUNC( ENUMCHILDWINDOWS )
{
pCodeBlock = hb_param( 2, HB_IT_BLOCK );
pParam = hb_param( 3, HB_IT_NUMERIC );
hb_retl( EnumChildWindows( ( HWND ) hb_parnl( 1 ), EnumChildProc, hb_parnl( 2 ) ) );
pCodeBlock = NULL;
pParam = NULL;
}
#pragma ENDDUMP
Code: Select all
Warning W8065 TASKN.prg 10: Call to function 'hb_itemPutNL' with no prototype in function EnumChildProc
Warning W8069 TASKN.prg 10: Nonportable pointer conversion in function EnumChildProc
Warning W8065 TASKN.prg 13: Call to function 'hb_evalBlock' with no prototype in function EnumChildProc
Warning W8065 TASKN.prg 15: Call to function 'hb_evalBlock1' with no prototype in function EnumChildProc
Warning W8065 TASKN.prg 17: Call to function 'hb_itemRelease' with no prototype in function EnumChildProc
Warning W8057 TASKN.prg 20: Parameter 'lParam' is never used in function EnumChildProc
Desde ya muchas gracias.
Saludos Esteban.
Ojeda Esteban Eduardo.
Buenos Aires - Argentina.
FWH - PellesC - DBF/CDX - ADS - Gloriosos .Bat - MySql - C# .net - FastReport
Skype: jreduojeda
Buenos Aires - Argentina.
FWH - PellesC - DBF/CDX - ADS - Gloriosos .Bat - MySql - C# .net - FastReport
Skype: jreduojeda
- Daniel Garcia-Gil
- Posts: 2365
- Joined: Wed Nov 02, 2005 11:46 pm
- Location: Isla de Margarita
- Contact:
Re: Como saber el proceso en ejecución?
Esteban
incluye este header
#include <hbapiitm.h>
a este warning no le prestes atencion
Warning W8057 TASKN.prg 20: Parameter 'lParam' is never used in function EnumChildProc
La funcion AddTask( ), tu mismo la implementas, supongo que la idea que presenta Antonio es que llenes un array con los handles de las ventanas hijas, ya teniendo esos valores podras disponer de ellos para el proceso que quieras
incluye este header
#include <hbapiitm.h>
a este warning no le prestes atencion
Warning W8057 TASKN.prg 20: Parameter 'lParam' is never used in function EnumChildProc
La funcion AddTask( ), tu mismo la implementas, supongo que la idea que presenta Antonio es que llenes un array con los handles de las ventanas hijas, ya teniendo esos valores podras disponer de ellos para el proceso que quieras
our best documentation is the source code
Isla de Margarita Venezuela.
danielgarciagil@gmail.com
http://tdolphin.blogspot.com/
https://www.dropbox.com/referrals/NTI5N ... rc=global9
Isla de Margarita Venezuela.
danielgarciagil@gmail.com
http://tdolphin.blogspot.com/
https://www.dropbox.com/referrals/NTI5N ... rc=global9
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Re: Como saber el proceso en ejecución?
Esteban,
Aqui esta la función completa. En este ejemplo uso la nueva función MsgList() incluida en FWH 10.7:
tags: EnumChildWindow GetTasks GetModuleFileName GetWindowThreadProcessId OpenProcess
Aqui esta la función completa. En este ejemplo uso la nueva función MsgList() incluida en FWH 10.7:
Code: Select all
#include "FiveWin.ch"
#define GWL_HINSTANCE -6
static aTasks := {}
function Main()
EnumChildWindows( GetDesktopWindow(), { | hWnd | AddTask( hWnd ) } )
MsgList( ASort( aTasks ) )
return nil
function AddTask( hWnd )
local cTaskName := GetWindowModuleFileName( hWnd )
if AScan( aTasks, cTaskName ) == 0
AAdd( aTasks, cTaskName )
endif
return nil
#pragma BEGINDUMP
#include <windows.h>
#include <psapi.h>
#include <hbapi.h>
HB_FUNC( GETWINDOWMODULEFILENAME )
{
HWND hWnd = ( HWND ) hb_parnl( 1 );
UINT processId = 0;
DWORD dwLength = 1024;
char buffer[ 1024 ];
HMODULE hProcess;
GetWindowThreadProcessId( hWnd, &processId );
hProcess = OpenProcess( 1040, 0, processId );
dwLength = GetModuleFileNameEx( hProcess, 0, buffer, dwLength );
CloseHandle( hProcess );
hb_retclen( buffer, dwLength );
}
#pragma ENDDUMP
tags: EnumChildWindow GetTasks GetModuleFileName GetWindowThreadProcessId OpenProcess
- jrestojeda
- Posts: 543
- Joined: Wed Jul 04, 2007 3:51 pm
- Location: Buenos Aires - Argentina
Re: Como saber el proceso en ejecución?
Antonio...
Aún me falta la siguiente función al enlazar:
GetModuleFileNameExA
Desde ya muchas gracias.
Aún me falta la siguiente función al enlazar:
GetModuleFileNameExA
Desde ya muchas gracias.
Ojeda Esteban Eduardo.
Buenos Aires - Argentina.
FWH - PellesC - DBF/CDX - ADS - Gloriosos .Bat - MySql - C# .net - FastReport
Skype: jreduojeda
Buenos Aires - Argentina.
FWH - PellesC - DBF/CDX - ADS - Gloriosos .Bat - MySql - C# .net - FastReport
Skype: jreduojeda
Re: Como saber el proceso en ejecución?
Esteban,
Tienes que agregar el siguiente archivo de Borland:
\bcc582\lib\psdk\psapi.lib
Saludos,
Carlos Gallego
Tienes que agregar el siguiente archivo de Borland:
\bcc582\lib\psdk\psapi.lib
Saludos,
Carlos Gallego
Saludos,
Carlos Gallego
*** FWH-20.07, xHarbour 1.2.3 Build 20190603, Borland C++7.30, PellesC ***
Carlos Gallego
*** FWH-20.07, xHarbour 1.2.3 Build 20190603, Borland C++7.30, PellesC ***
- jrestojeda
- Posts: 543
- Joined: Wed Jul 04, 2007 3:51 pm
- Location: Buenos Aires - Argentina
Re: Como saber el proceso en ejecución?
Muchas gracias, seguimos avandando.Cgallegoa wrote:Esteban,
Tienes que agregar el siguiente archivo de Borland:
\bcc582\lib\psdk\psapi.lib
Saludos,
Carlos Gallego
Con esto ya funciona el ejemplo de Antonio.
Ojeda Esteban Eduardo.
Buenos Aires - Argentina.
FWH - PellesC - DBF/CDX - ADS - Gloriosos .Bat - MySql - C# .net - FastReport
Skype: jreduojeda
Buenos Aires - Argentina.
FWH - PellesC - DBF/CDX - ADS - Gloriosos .Bat - MySql - C# .net - FastReport
Skype: jreduojeda
- jrestojeda
- Posts: 543
- Joined: Wed Jul 04, 2007 3:51 pm
- Location: Buenos Aires - Argentina
Re: Como saber el proceso en ejecución?
Hola a todos...
Sólo me falta el último detalle.
Por un lado tengo el array que me regresa la función GetTasks() Y por otro lado el array que me regresa la nueva función Addtask().
Cómo hago para relacionar estos dos Arrays?
Creo que necesitaría armar un array multidimensional, donde tenga en el mismo array lo que me regresa GetTasks() y lo que me regresa AddTask()
Con eso ya tendría la relación que hay entre los dos array y sabría que proceso que regresa AddTask() está asociado a cada cosa que regresa GetTasks()
Ejemplo:
Si lograra obterner con las dos fucniones un array multidimensional de esta forma sería perfecto.
Creo que con las dos funciones que tengo, se podría armar una sola función que me arme este array que necesito. Yo realmente no le encontré la vuelta.
Si alguien me tira una mano, estaré sumamente agradecido.
Sólo me falta el último detalle.
Por un lado tengo el array que me regresa la función GetTasks() Y por otro lado el array que me regresa la nueva función Addtask().
Cómo hago para relacionar estos dos Arrays?
Creo que necesitaría armar un array multidimensional, donde tenga en el mismo array lo que me regresa GetTasks() y lo que me regresa AddTask()
Con eso ya tendría la relación que hay entre los dos array y sabría que proceso que regresa AddTask() está asociado a cada cosa que regresa GetTasks()
Ejemplo:
Code: Select all
{"YouTube - YouTube de jreduojeda - Mozilla Firefox","C:\Archivos de programa\Mozilla Firefox\firefox.exe" }
{"Yahoo! Argentina - Windows Internet Explorer" ,"C:\Archivos de programa\Internet Explorer\iexplore.exe" }
{"Visor de eventos - Messenger Plus!" ,"C:\Archivos de programa\Windows Live\Messenger\msnmsgr.exe" }
{"Google - Mozilla Firefox" ,"C:\Archivos de programa\Mozilla Firefox\firefox.exe" }
{"Windows Live Messenger" ,"C:\Archivos de programa\Windows Live\Messenger\msnmsgr.exe" }
Creo que con las dos funciones que tengo, se podría armar una sola función que me arme este array que necesito. Yo realmente no le encontré la vuelta.
Si alguien me tira una mano, estaré sumamente agradecido.
Ojeda Esteban Eduardo.
Buenos Aires - Argentina.
FWH - PellesC - DBF/CDX - ADS - Gloriosos .Bat - MySql - C# .net - FastReport
Skype: jreduojeda
Buenos Aires - Argentina.
FWH - PellesC - DBF/CDX - ADS - Gloriosos .Bat - MySql - C# .net - FastReport
Skype: jreduojeda
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Re: Como saber el proceso en ejecución?
Eduardo,
Prueba asi:
Prueba asi:
Code: Select all
#include "FiveWin.ch"
#define GWL_HINSTANCE -6
static aTasks := {}
function Main()
local aTask
EnumChildWindows( GetDesktopWindow(), { | hWnd | AddTask( hWnd ) } )
for each aTask in aTasks
aTask = aTask[ 1 ] + ", " + aTask[ 2 ]
next
MsgList( ASort( aTasks ), "Applications in use" )
return nil
function AddTask( hWnd )
local cTaskName := GetWindowModuleFileName( hWnd )
if AScan( aTasks, { | aTask | aTask[ 2 ] == cTaskName } ) == 0
AAdd( aTasks, { GetWindowText( hWnd ), cTaskName } )
endif
return nil
#pragma BEGINDUMP
#include <windows.h>
#include <psapi.h>
#include <hbapi.h>
HB_FUNC( GETWINDOWMODULEFILENAME )
{
HWND hWnd = ( HWND ) hb_parnl( 1 );
UINT processId = 0;
DWORD dwLength = 1024;
char buffer[ 1024 ];
HMODULE hProcess;
GetWindowThreadProcessId( hWnd, &processId );
hProcess = OpenProcess( 1040, 0, processId );
dwLength = GetModuleFileNameEx( hProcess, 0, buffer, dwLength );
CloseHandle( hProcess );
hb_retclen( buffer, dwLength );
}
#pragma ENDDUMP
- jrestojeda
- Posts: 543
- Joined: Wed Jul 04, 2007 3:51 pm
- Location: Buenos Aires - Argentina
Re: Como saber el proceso en ejecución?
Perfecto Antonio.
Muchas gracias.
Saludos, Esteban.
Muchas gracias.
Saludos, Esteban.
Ojeda Esteban Eduardo.
Buenos Aires - Argentina.
FWH - PellesC - DBF/CDX - ADS - Gloriosos .Bat - MySql - C# .net - FastReport
Skype: jreduojeda
Buenos Aires - Argentina.
FWH - PellesC - DBF/CDX - ADS - Gloriosos .Bat - MySql - C# .net - FastReport
Skype: jreduojeda
Re: Como saber el proceso en ejecución?
Esteban
Cómo habilito el Administrador de tareas nuevamente, ya que el TASK32 lo desabilitó.
Saludos
Adhemar
Cómo habilito el Administrador de tareas nuevamente, ya que el TASK32 lo desabilitó.
Saludos
Adhemar
Saludos,
Adhemar C.
Adhemar C.