FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Como saber el proceso en ejecuci贸n?
Posts: 601
Joined: Wed Jul 04, 2007 03:51 PM
Como saber el proceso en ejecuci贸n?
Posted: Wed Jul 28, 2010 03:15 PM

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.

Ojeda Esteban Eduardo.

Buenos Aires - Argentina.

FWH - PellesC - DBF/CDX - ADS - Gloriosos .Bat - MySql - C# .net - FastReport

Skype: jreduojeda
Posts: 601
Joined: Wed Jul 04, 2007 03:51 PM
Re: Como saber el proceso en ejecuci贸n?
Posted: Thu Jul 29, 2010 03:24 PM

:?::?::?::roll:

Ojeda Esteban Eduardo.

Buenos Aires - Argentina.

FWH - PellesC - DBF/CDX - ADS - Gloriosos .Bat - MySql - C# .net - FastReport

Skype: jreduojeda
Posts: 601
Joined: Wed Jul 04, 2007 03:51 PM
Re: Como saber el proceso en ejecuci贸n?
Posted: Fri Jul 30, 2010 04:44 PM

:?::?::?::roll:

Ojeda Esteban Eduardo.

Buenos Aires - Argentina.

FWH - PellesC - DBF/CDX - ADS - Gloriosos .Bat - MySql - C# .net - FastReport

Skype: jreduojeda
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Re: Como saber el proceso en ejecuci贸n?
Posted: Fri Jul 30, 2010 09:41 PM
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/ms683198(v=VS.85).aspx

Vamos a implementarla y te mostramos aqui su c贸digo.
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Re: Como saber el proceso en ejecuci贸n?
Posted: Fri Jul 30, 2010 10:43 PM
Necesitamos usar la funci贸n EnumChildWindows() asi que la implementamos:
http://msdn.microsoft.com/en-us/library/ms633494(VS.85).aspx

Code (fw): Select all Collapse
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;
}

Un ejemplo de uso de esta funci贸n ser铆a:
Code (fw): Select all Collapse
EnumChildWindows( GetDesktopWindow(), { | hWnd | AddTask( hWnd ) } )
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 601
Joined: Wed Jul 04, 2007 03:51 PM
Re: Como saber el proceso en ejecuci贸n?
Posted: Fri Jul 30, 2010 11:49 PM
Antonio...
Antes que nada, muchas gracias por la respuesta.

Cre茅 un nuevo PRG al proyecto con lo siguiente:

Code (fw): Select all Collapse
#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


Por un lado me salen estos Warnings:
Code (fw): Select all Collapse
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


Por otro lado al enlazar me dice que me falta la funci贸n ADDTASK()

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
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Re: Como saber el proceso en ejecuci贸n?
Posted: Sat Jul 31, 2010 03:58 AM

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

Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Re: Como saber el proceso en ejecuci贸n?
Posted: Sat Jul 31, 2010 05:08 AM
Esteban,

Aqui esta la funci贸n completa. En este ejemplo uso la nueva funci贸n MsgList() incluida en FWH 10.7:

Code (fw): Select all Collapse
#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
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 601
Joined: Wed Jul 04, 2007 03:51 PM
Re: Como saber el proceso en ejecuci贸n?
Posted: Sat Jul 31, 2010 06:33 PM

Antonio...
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
Posts: 514
Joined: Sun Oct 16, 2005 03:32 AM
Re: Como saber el proceso en ejecuci贸n?
Posted: Sun Aug 01, 2010 12:19 AM

Esteban,

Tienes que agregar el siguiente archivo de Borland:

\bcc582\lib\psdk\psapi.lib

Saludos,

Carlos Gallego

Saludos,



Carlos Gallego



*** FWH-25.12, xHarbour 1.3.1 Build 20241008, Borland C++7.70, PellesC, ADS 11.1***

Posts: 601
Joined: Wed Jul 04, 2007 03:51 PM
Re: Como saber el proceso en ejecuci贸n?
Posted: Sun Aug 01, 2010 02:25 AM
Cgallegoa wrote:Esteban,

Tienes que agregar el siguiente archivo de Borland:

\bcc582\lib\psdk\psapi.lib

Saludos,

Carlos Gallego

Muchas gracias, seguimos avandando.
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
Posts: 601
Joined: Wed Jul 04, 2007 03:51 PM
Re: Como saber el proceso en ejecuci贸n?
Posted: Sun Aug 01, 2010 03:57 PM
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:
Code (fw): Select all Collapse
{"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" }

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.
Ojeda Esteban Eduardo.

Buenos Aires - Argentina.

FWH - PellesC - DBF/CDX - ADS - Gloriosos .Bat - MySql - C# .net - FastReport

Skype: jreduojeda
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Re: Como saber el proceso en ejecuci贸n?
Posted: Sun Aug 01, 2010 04:32 PM
Eduardo,

Prueba asi:
Code (fw): Select all Collapse
#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
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 601
Joined: Wed Jul 04, 2007 03:51 PM
Re: Como saber el proceso en ejecuci贸n?
Posted: Sun Aug 01, 2010 08:14 PM

Perfecto Antonio.
Muchas gracias.
Saludos, Esteban.

Ojeda Esteban Eduardo.

Buenos Aires - Argentina.

FWH - PellesC - DBF/CDX - ADS - Gloriosos .Bat - MySql - C# .net - FastReport

Skype: jreduojeda
Posts: 1710
Joined: Tue Oct 28, 2008 06:26 PM
Re: Como saber el proceso en ejecuci贸n?
Posted: Thu Aug 05, 2010 08:19 PM

Esteban

C贸mo habilito el Administrador de tareas nuevamente, ya que el TASK32 lo desabilit贸.

Saludos

Adhemar

Saludos,



Adhemar C.