No logro encontrar handle a SysListView32 de taskmanager

Iniciado por x64core, 9 Julio 2011, 02:52 AM

0 Miembros y 1 Visitante están viendo este tema.

x64core

hola buenas pues tengo un problema  :-\ estoy trabajando con un code para obtener informacion del syslistview del taskmanager :P
logro obtener el handle del task y logro obtener la clase de ventana ( "#32770" ) que es la del taskmanager :P pero a la hora de obtener los sub item no los puedo obtener noc enque estoy fallando  :(

en esta parte fallo :/

Código (vb) [Seleccionar]
Case "#32770"
i = FindWindowEx(lparam, 0, "#32770", "")
i = FindWindowEx(i, 0, "SysListView32", "")

ahora un select case para ver si es la ventana del taskmanager obteniendo la clase ( "#32770" ) luego lparam es el handle de la ventana, yo estoy utilizando un hook a las ventanas para obtenerlo :P luego uso la api findwindowex pero me devuelve 0 ayudaaaa :(
yo lo que quiero es obtener el handle de la syslistview para tener acceso a los items de la lista :P

e buscado en el foro encontre un codigo pero la forma es distinta y esta en c++ y no es con hooks :(
gracias


Sanlegas

Por que no buscas otra forma de obtener los procesos mediante apis... si por X razón el administrador de tareas no esta abierto/disponible no podrias obtener los procesos,
podrias dejar el enlace de c++ para ver que se puede hacer.
Y otra cosa... lo que estas intentando hacer NO es un hook  :-X

x64core

hola  ;D pues no estoy haciendo un hook el hook ya lo tengo hecho y es para ventanas bueno mi idea era obtener el nombre de un proceso o de mi proceso cualquier de las dos cosas para poder cambiarlo el nombre  :-\ y tambien noce quisiera usar ese metodo  :P

LeandroA

i = FindWindowEx(lparam, 0, "#32770", "")

Hola supuestamente el lparam es l handle de la ventana asi que no devias buscar la ventana  "#32770"  en caso que vos no tengas el lparam utilizas findwindow (no findwindowEx)

syslistivew32= FindWindowEx(lparam, ByVal 0&, "SysListView32", vbNullString)


te dejo un link que te va a sevir
http://www.recursosvisualbasic.com.ar/htm/listado-api/70-ocultar-administrador-tareas.htm

x64core

hola pana gracias pero no e podido arreglar mi problema  :-\
use esta linea que m dejaste:

syslistivew32= FindWindowEx(lparam, ByVal 0&, "SysListView32", vbNullString)
y tampoco siempre me devuelve 0 :P
y uso findwindowex noce si estoy mal pero para obtener el handle de los subitem de la ventana ( lparam) me puede explicar por favor
y vi tu codigo pero hace un gancho de proceso:
Public Function Procesos(ByVal hWnd2 As Long, _ 
                         lParam As String) As Boolean 


y no para de ejecutarse y yo no quiero q no pare de ejecutarse :P gracias!

Hasseds

Hola, una pregunta, de que SyslistView32 queres obtener el Hwnd... el de aplicaciones o el de Procesos ? 
Sergio Desanti


Hasseds

#7
Form

Código (vb) [Seleccionar]


Option Explicit

Private Sub Form_Load()
 
 AutoRedraw = True
 Call SetTimer(hwnd, &H0, &H14, AddressOf TimerProc)

End Sub




Modulo

Código (vb) [Seleccionar]


Option Explicit

'Modulo: HwndTask
'Autor: Sergio Desanti (Hasseds)
'Test: XP (32 BIT) & W7/UAC (32 BIT)
'Retorno:  Hwnd del administrador de tareas

Private Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Boolean
Private Declare Function EnumChildWindows Lib "user32" (ByVal hwndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal wIndx As Long) As Long
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwprocessid As Long) As Long

Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long

Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long

Dim RetEnumHwndParent As Long
Dim RetEnumHwndChilds As String

Public Function HwndTask() As Long
   Call EnumWindows(AddressOf EnumHwndParent, ByVal &H0)
   HwndTask = RetEnumHwndParent
End Function

Private Function EnumHwndParent(ByVal hwnd As Long, ByVal lParam As Long) As Boolean
   RetEnumHwndParent = 0
   RetEnumHwndChilds = ""
   If Not IsWinBorder(hwnd) = False And GetClase(hwnd) = "#32770" Then
     Call EnumChildWindows(hwnd, AddressOf EnumHwndChilds, ByVal &H0)
     If RetEnumHwndChilds = "DavesFrameClass" Then
       RetEnumHwndParent = hwnd
       Exit Function
     End If
   End If
   EnumHwndParent = True
End Function

Private Function EnumHwndChilds(ByVal hwnd As Long, ByVal lParam As Long) As Boolean
   RetEnumHwndChilds = GetClase(hwnd)
   If RetEnumHwndChilds = "DavesFrameClass" Then Exit Function
   EnumHwndChilds = True
End Function

Private Function GetClase(ByVal hwnd As Long) As String
   GetClase = Space$(&H10) '
   GetClase = Left$(GetClase, GetClassName(hwnd, GetClase, &H10))
End Function

Private Function IsWinBorder(ByVal hwnd As Long) As Boolean
   If (GetWindowLong(hwnd, &HFFF0) And &H800000) = &H800000 Then IsWinBorder = True
End Function

Public Function PidFrontHwnd(ByVal hwnd As Long) As Long
    Call GetWindowThreadProcessId(hwnd, PidFrontHwnd)
End Function

Public Sub TimerProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal idEvent As Long, ByVal dwTime As Long)

   Dim HwTask As Long
   Dim HwChild As Long
   Dim HwTab As Long
   Dim HwLv As Long
   
   HwTask = HwndTask
   
   If HwTask <> 0 Then
     HwTab = FindWindowEx(HwTask, 0, "SysTabControl32", vbNullString)
     If SendMessage(HwTab, &H130B, 0, 0) = 1 Then
       HwChild = FindWindowEx(HwTask, 0, "#32770", vbNullString)
       HwLv = FindWindowEx(HwChild, 0, "SyslistView32", vbNullString)
     End If
   End If
   
   Form1.Cls
   Form1.Print HwTask
   Form1.Print HwLv
 
End Sub





Sergio Desanti

x64core



PANA GRACIAS!!! SOLUCIONADO! solo una duda :P  :xD
que constante es esta que no defines? :P

If SendMessage(HwTab, &H1300 + 11, 0, 0) = 1 Then

Hasseds

#9
Estoy chequeando que el Tab Control es 1 (procesos)

el de Aplicaciones por ejemplo sería  0 (cero)
If SendMessage(HwTab, &H1300 + 11, 0, 0) = 0 Then



Private Const TCM_FIRST = &H1300  
Private Const TCM_GETCURSEL = (TCM_FIRST + 11)

Sergio Desanti