Visual Basic Foro
Programación => Visual Basic 6 => Mensaje iniciado por: m[a]rkus 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:
Modulo
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
-
hola por lo que puedo ver no estas buscando bien el SysListview32
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.
-
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
-
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
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
-
Dessa muchas gracias , y ahora que estuve comprobando leandro tenia razon con respecto a que no tomaba el hwnd del Syslistview32, asi lo tengo:
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
-
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
-
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.
-
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 (http://www.leandroascierto.com.ar/foro/index.php?topic=129.msg553#msg553)
-
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 ....
-
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 ?
-
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:
vent_4 = hwnd del SysListView32
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
-
Al final lo hice con SendKeys xDD no queria usarlo pero no quedo otra :D