Autor Tema: [DUDA] Cantidad de items de "SysListView32" y como abrirlos  (Leído 6106 veces)

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

m[a]rkus

  • Bytes
  • *
  • Mensajes: 39
  • Reputación: +0/-0
  • A veces un palo es simplemente un palo.
    • Ver Perfil
    • Qvanos
[DUDA] Cantidad de items de "SysListView32" y como abrirlos
« en: Abril 19, 2010, 01:00:03 pm »
Bueno gracias a Leando eh avanzado algo y lo mas importante entiendo ya como funciona la API "SendMessage" la verdad no era complicado jajaja pero bueno mi duda es la siguiente ya logre hacer que mi aplicacion cerrara la ventana de yahoo, y cerrara los pv que tuviera abiertos, pero ahora quiero contar la cantidad de contactos que tengo en mi yahoo y abrir alguno y no soy capaz, siempre me dice que ahi 0 contactos y de abrirlos no lo eh logrado porque no consigo seleccionarlos. Aqui pongo el code a ver si observan algo que este mal:

Citar
Modulo

Código: [Seleccionar]
Public Declare Function EnableWindow Lib "user32" (ByVal hWnd As Long, ByVal fEnable As Long) As Long
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Public Declare Function GetWindow Lib "user32" (ByVal hWnd As Long, ByVal wCmd As Long) As Long
Public Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Function SendMessageLong& Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long)
Public Declare Function SendMessageByString Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long
Public Declare Function ShowWindow Lib "user32" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long
 
Public Const BM_SETCHECK = &HF1
Public Const BM_GETCHECK = &HF0

Public Const CB_GETCOUNT = &H146
Public Const CB_GETLBTEXT = &H148
Public Const CB_SETCURSEL = &H14E

Public Const GW_HWNDFIRST = 0
Public Const GW_HWNDNEXT = 2
Public Const GW_CHILD = 5
Public Const LVM_FIRST = &H1000
Public Const LB_GETCOUNT = &H18B
Public Const LB_GETTEXT = &H189
Public Const LB_SETCURSEL = &H186

Public Const SW_HIDE = 0
Public Const SW_MAXIMIZE = 3
Public Const SW_MINIMIZE = 6
Public Const SW_NORMAL = 1
Public Const SW_SHOW = 5

Public Const VK_SPACE = &H20
Public Const LVM_GETITEMCOUNT = (LVM_FIRST + 4)
Public Const WM_CHAR = &H102
Public Const WM_CLOSE = &H10
Public Const WM_COMMAND = &H111
Public Const WM_GETTEXT = &HD
Public Const WM_GETTEXTLENGTH = &HE
Public Const WM_KEYDOWN = &H100
Public Const WM_KEYUP = &H101
Public Const WM_LBUTTONDBLCLK = &H203
Public Const WM_LBUTTONDOWN = &H201
Public Const WM_LBUTTONUP = &H202
Public Const WM_MOVE = &HF012
Public Const WM_RBUTTONDOWN = &H204
Public Const WM_RBUTTONUP = &H205
Public Const WM_SETTEXT = &HC
Public Const WM_SYSCOMMAND = &H112
'Otras variables
Public contactos As Long
'Otras variables

Sub cerrar()
Dim yahoo As Long
yahoo = FindWindow("yahoobuddymain", vbNullString)
Call SendMessageLong(yahoo, WM_CLOSE, 0&, 0&)
End Sub
Sub cerrarpv()
Dim vent_1 As Long
vent_1 = FindWindow("CConvWndBase", vbNullString)
Call SendMessageLong(vent_1, WM_CLOSE, 0&, 0&)
End Sub
Sub abrirpv()
Dim lista As Long
Dim vent_msg As Long
Dim Base1, Base2, Base3 As Long
Dim mensaje As String
Dim Boton As Long
mensaje = "Hola probando"
lista = FindWindow("SysListView32", vbNullString)
contactos = SendMessageLong(lista, LVM_GETITEMCOUNT, 0, 0)
Form1.Label1.Caption = contactos
'///////////////////////////////
Base1 = FindWindow("CConvWndBase", vbNullString)
Base2 = FindWindowEx(Base1, 0&, "YIMImputWindow", vbNullString)
Call SendMessageByString(Base2, WM_SETTEXT, 0&, mensaje)
Boton = FindWindowEx(Base1, 0&, "Button", vbNullString)
Call SendMessageLong(Boton, WM_LBUTTONDOWN, 0&, 0&)
Call SendMessageLong(Boton, WM_LBUTTONUP, 0&, 0&)
'///////////////////////////////
End Sub
« última modificación: Abril 19, 2010, 01:02:39 pm por m[a]rkus »
Existen dos maneras de ser feliz en esta vida, una es hacerse el idiota y la otra serlo.


LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1128
  • Reputación: +151/-8
    • Ver Perfil
Re:[DUDA] Cantidad de items de "SysListView32" y como abrirlos
« Respuesta #1 en: Abril 19, 2010, 02:41:05 pm »
hola por lo que puedo ver no estas buscando bien el SysListview32

Código: [Seleccionar]
lista = FindWindow("SysListView32", vbNullString)

el SysListView32 es una ventana hija por lo tando deverias utilizar  FindWindowEx, no tengo el yahoo msn pero bueno primero tenes que buscar con FindWindow la ventana padre y despues ir buscando con FindWindowEx SysListView32 pero esto puede llevar mas de un paso porque el SysListView32 puede estar dentro de otro control, suponete en visual basi hacemos una ventana padre (Formulario) depues ponemos un Frame (primer contenedor) y dentro del Frame ponemos un Listview , entonces primero buscamos el formulario con  FindWindow  dentro del hwnd que obtubimos buscamos el frame con FindWindowEx y dentro del hwnd que obtubimos buscamos con FindWindowEx el hwnd del listview.
tambien podes usar EnumChildWindows que es una api que te lista todas las ventanas hijas.


saludos me estoy cagando  :o.

m[a]rkus

  • Bytes
  • *
  • Mensajes: 39
  • Reputación: +0/-0
  • A veces un palo es simplemente un palo.
    • Ver Perfil
    • Qvanos
Re:[DUDA] Cantidad de items de "SysListView32" y como abrirlos
« Respuesta #2 en: Abril 19, 2010, 06:45:07 pm »
Bueno yo estoy usando Spy++ que me hace bastante facil el trabajo, pero suponiendo que llegue al SysListView32 cuales son los mensajes para enumerar el listview ? no se si me entiendas mi punto de vista , yo estoy usando LVM_GETITEMCOUNT pero nunca le da un valor, voy a probar bien todo y te digo, jajajaaj y todos cagamos lo jodido es que a veces da en momentos inesperados, bueno cualquier novedad aviso. Un saludo
Existen dos maneras de ser feliz en esta vida, una es hacerse el idiota y la otra serlo.


Dessa

  • Visitante
Re:[DUDA] Cantidad de items de "SysListView32" y como abrirlos
« Respuesta #3 en: Abril 19, 2010, 07:26:00 pm »
Hola m[a]rkus, si ya tenes el Hwnd... GetListViewCount te tira el total de items, con este total creas un  For (1 to Total de items) y con ListViewGetText dentro de ese For vas a poder ver los items

@ Leandro, llegaste a tiempo ?   ;D

Código: [Seleccionar]

Option Explicit

Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function VirtualAllocEx Lib "kernel32" (ByVal hProcess As Long, ByVal lpAddress As Long, ByVal dwSize As Long, ByVal flAllocationType As Long, ByVal flProtect As Long) As Long
Private Declare Function VirtualFreeEx Lib "kernel32" (ByVal hProcess As Long, lpAddress As Any, ByVal dwSize As Long, ByVal dwFreeType As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) 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


Private Type LVITEM
  mask As Long
  iItem As Long
  iSubitem As Long
  state As Long
  stateMask As Long
  pszText As Long
  cchTextMax As Long
  iImage As Long
  lParam As Long
  iIndent As Long
End Type

Private Const LVIF_IMAGE = &H2
Private Const LVIF_TEXT = &H1
Private Const LVM_FIRST As Long = &H1000
Private Const LVM_GETITEM As Long = (LVM_FIRST + 5)
Private Const LVM_GETITEMCOUNT = (LVM_FIRST + 4)
Private Const LVM_GETITEMSTATE = (LVM_FIRST + 44)
Private Const LVIS_SELECTED = &H2
Private Const LVM_SETITEMSTATE = (LVM_FIRST + 43)
Private Const LVIF_STATE = &H8&
Private Const PAGE_READWRITE = &H4&
Private Const MEM_RESERVE = &H2000
Private Const MEM_COMMIT = &H1000
Private Const MEM_RELEASE = &H8000
Private Const PROCESS_VM_OPERATION = &H8
Private Const PROCESS_VM_READ = &H10
Private Const PROCESS_VM_WRITE = &H20

Private hWndlvw As Long

Function ListViewGetText(ByVal hwnd As Long, ByVal iSubitem As Integer, ByVal iItem As Integer) As String
   
    Dim lngProcID As Long, lngProcHandle As Long
    Dim typLvItem As LVITEM, strLvItem As String
    Dim lngVarPtr1 As Long, lngVarPtr2 As Long
    Dim lngMemVar1 As Long, lngMemVar2 As Long
    Dim lngMemLen1 As Long, lngMemLen2 As Long
    Call GetWindowThreadProcessId(hwnd, lngProcID)
    If lngProcID <> 0 Then
        lngProcHandle = OpenProcess(PROCESS_VM_OPERATION Or PROCESS_VM_READ Or PROCESS_VM_WRITE, False, lngProcID)
        If lngProcHandle <> 0 Then
            strLvItem = String(255, vbNullChar)
            lngVarPtr1 = StrPtr(strLvItem)
            lngVarPtr2 = VarPtr(typLvItem)
            lngMemLen1 = LenB(strLvItem)
            lngMemLen2 = LenB(typLvItem)
            lngMemVar1 = VirtualAllocEx(lngProcHandle, 0, lngMemLen1, MEM_RESERVE Or MEM_COMMIT, PAGE_READWRITE)
            lngMemVar2 = VirtualAllocEx(lngProcHandle, 0, lngMemLen2, MEM_RESERVE Or MEM_COMMIT, PAGE_READWRITE)
            With typLvItem
                .cchTextMax = 255
                .iItem = iItem
                .iSubitem = iSubitem
                .mask = LVIF_TEXT
                .pszText = lngMemVar1
            End With
            Call WriteProcessMemory(lngProcHandle, ByVal lngMemVar1, ByVal lngVarPtr1, lngMemLen1, 0)
            Call WriteProcessMemory(lngProcHandle, ByVal lngMemVar2, ByVal lngVarPtr2, lngMemLen2, 0)
            Call SendMessage(hwnd, LVM_GETITEM, ByVal 0, ByVal lngMemVar2)
            Call ReadProcessMemory(lngProcHandle, ByVal lngMemVar1, ByVal lngVarPtr1, lngMemLen1, 0)
            strLvItem = StrConv(strLvItem, vbUnicode)
            strLvItem = Left(strLvItem, InStr(1, strLvItem, vbNullChar) - 1)
            ListViewGetText = strLvItem
            Call VirtualFreeEx(lngProcHandle, ByVal lngMemVar1, lngMemLen1, MEM_RELEASE)
            Call VirtualFreeEx(lngProcHandle, ByVal lngMemVar2, lngMemLen2, MEM_RELEASE)
            Call CloseHandle(lngProcHandle)
        End If
    End If

End Function

Function GetListViewCount(ByVal hwnd As Long) As Long
  GetListViewCount = SendMessage(hwnd, LVM_GETITEMCOUNT, 0, ByVal 0)
End Function




m[a]rkus

  • Bytes
  • *
  • Mensajes: 39
  • Reputación: +0/-0
  • A veces un palo es simplemente un palo.
    • Ver Perfil
    • Qvanos
Re:[DUDA] Cantidad de items de "SysListView32" y como abrirlos
« Respuesta #4 en: Abril 19, 2010, 07:29:15 pm »
Dessa muchas gracias , y ahora que estuve comprobando leandro tenia razon con respecto a que no tomaba el hwnd del Syslistview32, asi lo tengo:

Código: [Seleccionar]
Sub cargar()
Dim vent_1, vent_2, vent_3 As Long
vent_1 = FindWindow("yahoobuddymain", vbNullString)
vent_2 = FindWindowEx(vent_1, 0&, "ListView", vbNullString)
vent_3 = FindWindowEx(vent_2, 0&, "SysListView32", vbNullString)
Form1.Label2.Caption = vent_1
Form1.Label3.Caption = vent_2
Form1.Label4.Caption = vent_3
End Sub

Y el de yahoobuddymain todo OK , pero no me da de los otros, voy a usar la api esa de enumchildrenwindows a ver... gracias a los 2 creo que hoy termino o al menos hago lo esencial. Cualquier novedad posteo
Existen dos maneras de ser feliz en esta vida, una es hacerse el idiota y la otra serlo.


Dessa

  • Visitante
Re:[DUDA] Cantidad de items de "SysListView32" y como abrirlos
« Respuesta #5 en: Abril 19, 2010, 07:45:54 pm »
Hola m[a]rkus, si ya tenes el Hwnd... GetListViewCount te tira el total de items, con este total creas un  For (1 to Total de items) y con ListViewGetText dentro de ese For vas a poder ver los items


Perdoname, el For tiene que ser de 0 to Total de items-1


m[a]rkus

  • Bytes
  • *
  • Mensajes: 39
  • Reputación: +0/-0
  • A veces un palo es simplemente un palo.
    • Ver Perfil
    • Qvanos
Re:[DUDA] Cantidad de items de "SysListView32" y como abrirlos
« Respuesta #6 en: Abril 19, 2010, 07:48:51 pm »
ok pero aun no logro encontrar el hwnd del Syslistview32 por el Spy++ lo veo bien, pero desde mi app algo me falta y no se que cosa es.
Existen dos maneras de ser feliz en esta vida, una es hacerse el idiota y la otra serlo.


Dessa

  • Visitante
Re:[DUDA] Cantidad de items de "SysListView32" y como abrirlos
« Respuesta #7 en: Abril 19, 2010, 07:58:34 pm »
Fijate si  este code  te ayuda a ver lo que te estas salteando: 

http://www.leandroascierto.com.ar/foro/index.php?topic=129.msg553#msg553


m[a]rkus

  • Bytes
  • *
  • Mensajes: 39
  • Reputación: +0/-0
  • A veces un palo es simplemente un palo.
    • Ver Perfil
    • Qvanos
Re:[DUDA] Cantidad de items de "SysListView32" y como abrirlos
« Respuesta #8 en: Abril 19, 2010, 08:03:49 pm »
Jajajaja pues si, imaginate acabo de ver el arbol son 4 y yo estaba probando con solo 2, que animal soy disculpenme jaja ahora me dio risa, bueno gracias a los dos. a ver ahora si me funciona ....
Existen dos maneras de ser feliz en esta vida, una es hacerse el idiota y la otra serlo.


m[a]rkus

  • Bytes
  • *
  • Mensajes: 39
  • Reputación: +0/-0
  • A veces un palo es simplemente un palo.
    • Ver Perfil
    • Qvanos
Re:[DUDA] Cantidad de items de "SysListView32" y como abrirlos
« Respuesta #9 en: Abril 19, 2010, 08:43:06 pm »
Ya esta, me da el total y en un List me saca todo lo que tengo en yahoo. Mañana sigo  gracias a los dos

Ya logre que cuando le diera clic a uno de los contactos en mi Listbox se seleccionara en yahoo, pero no se como hacer que se abra la conversacion, alguna idea ?
« última modificación: Abril 19, 2010, 09:36:11 pm por m[a]rkus »
Existen dos maneras de ser feliz en esta vida, una es hacerse el idiota y la otra serlo.


m[a]rkus

  • Bytes
  • *
  • Mensajes: 39
  • Reputación: +0/-0
  • A veces un palo es simplemente un palo.
    • Ver Perfil
    • Qvanos
Re:[DUDA] Cantidad de items de "SysListView32" y como abrirlos
« Respuesta #10 en: Abril 20, 2010, 05:51:52 pm »
Como hago dobleclic al item selecionado del SySListView32 ?
O sea yo ya lo tengo selecionado y tengo el hwnd del SysListView32 y asi tengo el code:

Citar
vent_4 = hwnd del SysListView32
Código: [Seleccionar]
Sub abrir_enviar()
Call SelectedItem(vent_4, 5)
Call SendMessageLong(vent_4, WM_LBUTTONDOWN, 0&, 0&)
Call SendMessageLong(vent_4, WM_LBUTTONUP, 0&, 0&)
'SendKeys "{ENTER}"
'LB_SETITEMDATA
'SendKeys "Hola como estas?"
End Sub
Existen dos maneras de ser feliz en esta vida, una es hacerse el idiota y la otra serlo.


m[a]rkus

  • Bytes
  • *
  • Mensajes: 39
  • Reputación: +0/-0
  • A veces un palo es simplemente un palo.
    • Ver Perfil
    • Qvanos
Re:[DUDA] Cantidad de items de "SysListView32" y como abrirlos
« Respuesta #11 en: Abril 20, 2010, 09:02:18 pm »
Al final lo hice con SendKeys xDD no queria usarlo pero no quedo otra :D
Existen dos maneras de ser feliz en esta vida, una es hacerse el idiota y la otra serlo.