hola :¬¬
quería pedirles si alguien puede mostear o introducirme en algún método para poder identificar a que archivo pertenece una ventana especifica.
y si se puede teniendo el handle de un botón obtener el de su contenedor
desde ya!... ...muchas gracias.
'Recupera el Handle de la ventana padre de una ventana o control
Private Declare Function GetParent Lib "user32" (ByVal Hwnd As Long) As Long
gracias ya averiguo sobre esa api
y sobre saber q archivo contiene el código que la llamo?
No entendi muy bien la pregunta del 'archivo' :-X
Pero creo que es esto lo que quieres:
1ero: Obtener el Hwnd de la ventana. (FindWindow,GetParent...)
2ndo: Obtenemos el Proceso el cual es dueño de esa ventana. (GetWindowThreadProcessId (http://msdn.microsoft.com/en-us/library/ms633522(VS.85).aspx))
3ero: Obtenemos la ruta del ejecutable que es ese proceso. (OpenProcess y GetModuleFileNameEx (http://www.recursosvisualbasic.com.ar/htm/listado-api/183-listar-ruta-de-procesos-de-windows.htm))
Espero haberte ayudado ;D
Feliz Navidad :D
si ;D es exactamente lo que necesitaba.
gracias a los dos.
Cita de: <[(x)]> en 26 Diciembre 2008, 22:45 PM
si ;D es exactamente lo que necesitaba.
gracias a los dos.
De nada, para eso estamos ;)
Saludos ;D
hola
aka les dejo lo q logre hacer fijen se si no tiene algún choclo y si se puede mejorar graciass.
Module1.bas
Option Explicit
'<lapis
Private Declare Function EnumProcesses Lib "PSAPI.DLL" (ByRef lpidProcess As Long, ByVal cb As Long, ByRef cbNeeded As Long) As Long
Private Declare Function OpenProcess Lib "kernel32.dll" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function GetModuleFileNameExA Lib "PSAPI.DLL" (ByVal hProcess As Long, ByVal hModule As Long, ByVal lpFilename As String, ByVal nSize As Long) As Long
Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject 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 GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
'lapis>
'<constantes
Private Const PROCESS_VM_READ As Long = (&H10)
Private Const PROCESS_QUERY_INFORMATION As Long = (&H400)
Private Const SW_SHOWNORMAL = 1
Private Const WM_CLOSE = &H10
'Private Const gcClassnameMSWord = "OpusApp"
'Private Const gcClassnameMSExcel = "XLMAIN"
'Private Const gcClassnameMSIExplorer = "IEFrame"
'Private Const gcClassnameMSVBasic = "wndclass_desked_gsk"
'Private Const gcClassnameNotePad = "Notepad"
'Private Const gcClassnameMyVBApp = "ThunderForm"
'Private Const gcClassnameFolder = CabinetWClass 'De explorer.exe
'constantes>
'procedimiento >>
Public Sub GetPathProces(Optional ClassName As String = vbNullString, Optional WindowsName As String = vbNullString)
On Error GoTo eler
Dim WinWnd As Long, ret As String, lpClassName As String
Dim Buffer As String
Dim i_Procesos As Long
Dim Array_Procesos() As Long, RetVal As Long
Dim sd As Long
Dim ret1 As Long
Dim Ruta As String
Dim t_cbNeeded As Long
Dim Handle_Proceso As Long
Dim i As Long
ReDim Array_Procesos(250) As Long
' Recoje el handle de la ventana
WinWnd = FindWindow(vbNullString, ret)
If WinWnd = 0 Then MsgBox "Couldn't find the window ...": Exit Sub
lpClassName = Space(256)
RetVal = GetClassName(WinWnd, lpClassName, 256)
MsgBox "Classname: " + Left$(lpClassName, RetVal)
' Carga la variable sd con la id del proceso
GetWindowThreadProcessId WinWnd, sd
' Obtiene un array con los id de los procesos
ret = EnumProcesses(Array_Procesos(1), 1000, t_cbNeeded): i_Procesos = t_cbNeeded / 4
' Recorre todos los procesos
For i = 1 To i_Procesos
If Array_Procesos(i) = sd Then
' Lo abre y devuelve el handle
Handle_Proceso = OpenProcess(PROCESS_QUERY_INFORMATION + PROCESS_VM_READ, 0, Array_Procesos(i))
If Handle_Proceso <> 0 Then
' Crea un buffer para almacenar el nombre y ruta
Buffer = Space(255)
' Le pasa el Buffer al Api y el Handle
ret1 = GetModuleFileNameExA(Handle_Proceso, 0, Buffer, 255)
' Le elimina los espacios nulos a la cadena devuelta
Ruta = Left(Buffer, ret1)
End If
' Cierra el proceso abierto
ret1 = CloseHandle(Handle_Proceso)
' Muestra la ruta del proceso y ee id
MsgBox Ruta & " " & Array_Procesos(i), vbInformation, "info"
Exit For
End If
DoEvents
Next
Exit Sub
eler:
MsgBox Err.Description, vbCritical, "Esto no tendria q haber pasado."
End Sub
Sub main()
GetPathProces , InputBox("Escriba el titulo de una ventana.", "prueva uno", "ej: Mi Pc", (Screen.Width / 2) - 2500, (Screen.Height / 2) - 1500)
End Sub
un 90(0 d3 (091 94573 n0 l3 h483 m4l 4 n4d13
Otra Opcion:
Option Explicit
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwprocessid As Long) As Long
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) 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
'Abre un proceso para poder obtener el path ( Retorna el handle )
Private Declare Function OpenProcess Lib "kernel32.dll" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
'Obtiene el nombre del proceso a partir de un handle
Private Declare Function GetModuleFileNameExA Lib "PSAPI.DLL" (ByVal hProcess As Long, ByVal hModule As Long, ByVal lpFilename As String, ByVal nSize As Long) As Long
' Cierra y libera el proceso abierto con OpenProcess
Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long
Private Const PROCESS_VM_READ As Long = (&H10)
Private Const PROCESS_QUERY_INFORMATION As Long = (&H400)
Function ProcIDFromWnd(ByVal hwnd As Long) As Long
Dim idProc As Long:
'crea PID de un HWnd
GetWindowThreadProcessId hwnd, idProc
'retorno del PID
ProcIDFromWnd = idProc
End Function
Private Sub Command1_Click()
Shell "calc"
Dim Handle_Proceso As Long: Dim Buffer As String
Dim ret As Long: Dim Ruta As String
Dim Handle As Long: Handle = FindWindow("SciCalc", vbNullString)
'MsgBox ProcIDFromWnd(Handle)
Handle_Proceso = OpenProcess(PROCESS_QUERY_INFORMATION + PROCESS_VM_READ, 0, ProcIDFromWnd(Handle))
If Handle_Proceso <> 0 Then
Buffer = Space(255) ' Crea un buffer para almacenar el nombre y ruta
ret = GetModuleFileNameExA(Handle_Proceso, 0, Buffer, 255) ' Le pasa el Buffer al Api y el Handle
Ruta = Left(Buffer, ret) ' Le elimina los espacios nulos a la cadena devuelta
End If
ret = CloseHandle(Handle_Proceso) 'Cierra el proceso abierto
MsgBox Ruta 'Muestra la ruta del proceso
'cierro la calculadora
Call SendMessage(FindWindow("SciCalc", vbNullString), &H112, &HF060&, 0)
End
End Sub
Saludos
Por coordenadas del mouse:
Option Explicit
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwprocessid As Long) As Long
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) 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 OpenProcess Lib "kernel32.dll" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
'Obtiene el nombre del proceso a partir de un handle
Private Declare Function GetModuleFileNameExA Lib "PSAPI.DLL" (ByVal hProcess As Long, ByVal hModule As Long, ByVal lpFilename As String, ByVal nSize As Long) As Long
Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long
Private Const PROCESS_VM_READ As Long = (&H10)
Private Const PROCESS_QUERY_INFORMATION As Long = (&H400)
'Obtiene el Handle de una ventana a partir de una coordenada
Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
'Recupera la coordenada del cursor
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Type POINTAPI
x As Long
y As Long
End Type
Function ProcIDFromWnd(ByVal hwnd As Long) As Long
Dim idProc As Long
GetWindowThreadProcessId hwnd, idProc 'crea ID de un proceso desde un HWnd
ProcIDFromWnd = idProc 'retorno de la ID de un proceso
End Function
Private Sub Form_Load()
Timer1.Interval = 100
End Sub
Private Sub Timer1_Timer()
Dim retorno As Long
Dim Handle As Long
Dim Cor As POINTAPI
'Obtiene la coordenada del Mouse
retorno = GetCursorPos(Cor)
'Recuperamos el HWND de la ventana asociada a esa coordenada
Handle = WindowFromPoint(Cor.x, Cor.y)
Dim Handle_Proceso As Long: Handle_Proceso = OpenProcess(&H400 + &H10, 0, ProcIDFromWnd(Handle))
If Handle_Proceso <> 0 Then
Dim Buffer As String: Buffer = Space(255) ' Crea un buffer para almacenar el nombre y ruta
Dim ret As Long: ret = GetModuleFileNameExA(Handle_Proceso, 0, Buffer, 255) ' pasa el Buffer al Api y el Handle
Dim Ruta As String: Ruta = Left(Buffer, ret) ' Le elimina los espacios nulos a la cadena devuelta
End If
ret = CloseHandle(Handle_Proceso) 'Cierra el proceso abierto
Me.Cls: Me.Print Ruta 'Muestra la ruta del proceso
End Sub
Saludos
Cita de: Dessa en 28 Diciembre 2008, 03:57 AM
Por coordenadas del mouse:
Option...
... Sub
Saludos
muy bueno jeje estaba pensando en hacerlo pero no se no me puse jeje..
holas
notaste que si cierras el explorer.exe y pones el mouse sobre la imagen del escritorio. El programa allá el handle y la id del proceso, pero al llegar a la api OpenProcess esta devuelve un handle=0 lo que no permite allar el nombre ni la ruta del proceso... :-X
Por supuesto, si está cerrado, se soluciona con "Shell explorer.exe" pero si a alguien se le ocurre cerrar el explorer podes usar este code
http://foro.elhacker.net/programacion_vb/evitar_que_cierren_mi_aplicacion_src-t237547.0.html
PD: Todo bien <[(x)]>, pero: "como hallar el Exe al que pertenece la ventana ???", seria un buen título (jeje...)
Saludos
se cambiado=true :P
jeje. y Dessa con lo anterior me refería a que exe le pertenece la ventana que queda con la imagen de fondo... :-\
osea como hacer para saber cual es no tratar de ocultarlo oponiendo nos a que no cierren otras app..
Será el de classname "#32769" y handle constante 65556 ventana padre (del Padre) de explorer.
Fijate con este buscador (sencillo)
http://rapidshare.com/files/177113270/buscador.exe
Saludos
se pero como lo identificas?
Option Explicit
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwprocessid As Long) As Long
Private Sub Form_Load()
MsgBox ProcIDFromWnd(65556)
' el Hwnd es constante(65556)
' ID de proceso tambien es constante (452)
End
End Sub
Function ProcIDFromWnd(ByVal hwnd As Long) As Long
Dim idProc As Long
GetWindowThreadProcessId hwnd, idProc
ProcIDFromWnd = idProc
End Function
El Exe a que pertenece es SMSS.EXE (fijate al clasificar):
http://www.recursosvisualbasic.com.ar/htm/listado-api/183-listar-ruta-de-procesos-de-windows.htm
PD: si encontras alguna manera para manipular este número de ID de proceso o entrarle a su Hwnd por favor postealo, Saludos
Por coordenadas del mouse "V 2.0"
Solo hay que agregar un Timer1
Option Explicit
Private Declare Function SetWindowPos Lib "user32" (ByVal Hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal Hwnd As Long, lpdwprocessid As Long) As Long
Private Declare Function OpenProcess Lib "kernel32.dll" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function GetModuleFileNameExA Lib "PSAPI.DLL" (ByVal hProcess As Long, ByVal hModule As Long, ByVal lpFilename As String, ByVal nSize As Long) As Long
Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long
Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Type POINTAPI: x As Long: y As Long: End Type
Private Sub Form_Load()
Me.BackColor = vbBlack: Me.ForeColor = vbWhite: Me.FontBold = True
Me.Top = 0: Me.Left = 0: Me.Width = 6450: Me.Height = 1000
Me.BorderStyle = 5: Timer1.Interval = 100
End Sub
'Private Sub Form_Load(): Timer1.Interval = 100: End Sub
Private Sub Timer1_Timer()
Call SetWindowPos(Me.Hwnd, -1, 0, 0, 0, 0, &H2 Or &H1)
Dim Cor As POINTAPI: Dim retorno As Long: retorno = GetCursorPos(Cor)
Dim Handle As Long: Handle = WindowFromPoint(Cor.x, Cor.y)
Dim idProc As Long: Call GetWindowThreadProcessId(Handle, idProc)
Dim Handle_Proceso As Long: Handle_Proceso = OpenProcess(&H400 + &H10, 0, idProc)
Dim Buffer As String: Buffer = Space(255)
Dim ret As Long: ret = GetModuleFileNameExA(Handle_Proceso, 0, Buffer, 255)
Dim Ruta As String: Ruta = Left(Buffer, ret): ret = CloseHandle(Handle_Proceso)
Me.Cls: Me.Print "": Me.Print Ruta: Me.Caption = "ID PROCESO = " & idProc
End Sub
Saludos
bien
gracias.