Título: si una ventana esta abierta devolver el hwnd
Publicado por: rubeng en 8 Septiembre 2007, 04:24 am
tengo esto para enumerar las ventanas abiertas en el form Option Explicit
Private Sub Command1_Click() Erase Valores nProcesos = 0 'Llama a Enumwindows para listar las ventanas y obtener la información EnumWindows AddressOf Listar_Ventanas, 0 cargar End Sub
Sub cargar()
Dim i As Integer Dim LItem As ListItem 'variable para los subitems del listview
ListView1.ListItems.Clear For i = 1 To nProcesos With Valores(i) If .captionWin <> "Program Manager" And .captionWin <> vbNullString _ And .captionWin <> "Project1" Then ' Si la ventana es visible If IsWindowVisible(.HwndWin) Then 'Obtiene el ícono de la ventana Call Obtener_Icono(.HwndWin) 'Agrega el Item y subitems al ListView Set LItem = ListView1.ListItems.Add(, , .captionWin, , _ ImageList1.ListImages.Count) LItem.SubItems(1) = .HwndWin LItem.SubItems(2) = .Estado LItem.SubItems(3) = .Left LItem.SubItems(4) = .Right LItem.SubItems(5) = .Top LItem.SubItems(6) = .Bottom End If End If End With Next
End Sub
'Sub que obtiene el ícono de la ventana y luego lo coloca en el Listview Private Sub Obtener_Icono(h As Long) 'Variable Rect para usar con el API setRect y Drawcaption Dim rec As RECT
With Picture1 'Limpia el Picturebox .Cls .Picture = Nothing Call SetRect(rec, 5, 7, 10, 10) 'Dibuja el icono en el picture pasandole al api el _ hwnd de la ventana Call DrawCaption(h, .hDC, rec, 4) .Refresh Set .Picture = Picture1.Image
End With ' Almacena la imagen en el ImageList ImageList1.ListImages.Add , , Picture:=Picture1 ' Si el ImageList no está inicializado se enlaza al ListView If ListView1.SmallIcons Is Nothing Then Set ListView1.SmallIcons = ImageList1 End If End Sub
Private Sub Form_Load() With ListView1 'vista de reporte .View = lvwReport 'Columnas .ColumnHeaders.Add , , " Título de la ventana " .ColumnHeaders.Add , , " HWND " .ColumnHeaders.Add , , " Estado " .ColumnHeaders.Add , , " Left " .ColumnHeaders.Add , , " Right " .ColumnHeaders.Add , , " Top " .ColumnHeaders.Add , , " Bottom " .ColumnHeaders(1).Width = 4000 .ColumnHeaders(2).Width = 1000 .ColumnHeaders(3).Width = 1200 .ColumnHeaders(4).Width = 700 .ColumnHeaders(5).Width = 800 .ColumnHeaders(6).Width = 800 .ColumnHeaders(7).Width = 800 End With
'Propiedades para el Picture invisible en el cual se dibuja _ el icono de la ventana mediante el Api DrawCaption With Picture1 .ScaleMode = vbPixels .Width = 260 .Height = 260 .AutoRedraw = True .BorderStyle = 0 .BackColor = ListView1.BackColor .Visible = False End With
Me.Caption = " Información de ventanas de windows " Command1.Caption = " Listar ventanas "
End Sub en un modulo Option Explicit
'Udt '############## Type ProcData HwndWin As Long captionWin As String Estado As String Left As Long Top As Long Right As Long Bottom As Long End Type
Type POINTAPI x As Long y As Long End Type
Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type
Type WINDOWPLACEMENT length As Long flags As Long showCmd As Long ptMinPosition As POINTAPI ptMaxPosition As POINTAPI rcNormalPosition As RECT End Type 'Declaraciones Api '################# Declare Function DrawCaption Lib "user32" (ByVal hwnd As Long, ByVal hDC As Long, _ pcRect As RECT, ByVal un As Long) As Long Declare Function SetRect Lib "user32" (lpRect As RECT, ByVal X1 As Long, ByVal Y1 _ As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long Declare Function IsWindowVisible Lib "user32" (ByVal hwnd As Long) As Long Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Any, ByVal _ lParam As Long) As Long Declare Function GetWindowPlacement Lib "user32" (ByVal hwnd As Long, lpwndpl As _ WINDOWPLACEMENT) As Long Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _ (ByVal hwnd As Long, ByVal lpString As String, _ ByVal cch As Long) As Long
'Variables '##########
Public Valores() As ProcData Public nProcesos As Integer
'Función que enumera las ventanas de windows
Public Function Listar_Ventanas(ByVal Handle As Long, _ ByVal lParam As Long) As Boolean
Dim infoWin As WINDOWPLACEMENT
Dim buffer As String * 256 Dim l As Long
nProcesos = nProcesos + 1 'redimensiona el vector ReDim Preserve Valores(1 To nProcesos) With Valores(nProcesos) .HwndWin = Handle
' Recupera el título de la ventana l = GetWindowText(Handle, buffer, Len(buffer)) 'Remplaza los Nulos .captionWin = Replace(buffer, Chr(0), vbNullString) infoWin.length = Len(infoWin) Call GetWindowPlacement(Handle, infoWin) 'Guarda el estado de la ventana Select Case infoWin.showCmd Case 1 .Estado = "Normal" Case 2 .Estado = "Minimizado" Case 3 .Estado = "Maximizado" End Select 'Guarda la posición de la ventana .Left = infoWin.rcNormalPosition.Left .Top = infoWin.rcNormalPosition.Top .Right = infoWin.rcNormalPosition.Right .Bottom = infoWin.rcNormalPosition.Bottom End With ' Continúa buscando las demás ventanas Listar_Ventanas = 1 End Function
lo que quiero hacer es si determinada ventana con cierto caption esta entre las ventanas esas que me de su hwnd en un textbox como se haria esto?
Título: Re: si una ventana esta abierta devolver el hwnd
Publicado por: rubeng en 8 Septiembre 2007, 14:14 pm
nadie tiene idea? con este codigo se simplifica el proceso alguien sabe como?
Título: Re: si una ventana esta abierta devolver el hwnd
Publicado por: ~~ en 8 Septiembre 2007, 18:44 pm
Pues usa FindWindow q te devuelve el handle de una ventana con su nombre..
Título: Re: si una ventana esta abierta devolver el hwnd
Publicado por: rubeng en 9 Septiembre 2007, 18:52 pm
viste el ejemplo? te da el nombre de las ventanas abiertas y sus hwnd? deberia hacer algo asi si la ventana esta abierta mostrar su hwnd en un textbox no se como hacerlo alguna idea? gracias
Título: Re: si una ventana esta abierta devolver el hwnd
Publicado por: rubeng en 11 Septiembre 2007, 19:13 pm
alguien no tiene idea? este codigo te da el hwnd alguna idea?
Título: Re: si una ventana esta abierta devolver el hwnd
Publicado por: byebye en 11 Septiembre 2007, 20:56 pm
no sabes tu hacer una comparacion? esque pegais un codigo que ni entendeis y venis a preguntar como adaptarlo a "vuestro programa".
Título: Re: si una ventana esta abierta devolver el hwnd
Publicado por: ~~ en 12 Septiembre 2007, 01:40 am
no sabes tu hacer una comparacion? esque pegais un codigo que ni entendeis y venis a preguntar como adaptarlo a "vuestro programa".
Q gran verdad.....
Para listar las ventanas usa mejor este ejemplo q es mas simple http://www.recursosvisualbasic.com.ar/htm/listado-api/api-39.htm Pero si conoces el titulo exacto de la ventana no te complikes y usa findwindow: Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Sub Form_Load() MsgBox FindWindow(vbNullString, "Sin título - Bloc de notas") End Sub
Como ya te dije en mi anterior mensaje: Pues usa FindWindow q te devuelve el handle de una ventana con su nombre..
Aunke seria mejor q aprendieras a usar apis..
Título: Re: si una ventana esta abierta devolver el hwnd
Publicado por: rubeng en 12 Septiembre 2007, 22:27 pm
no sabes tu hacer una comparacion? esque pegais un codigo que ni entendeis y venis a preguntar como adaptarlo a "vuestro programa". por lo que veo vos no entendes el funcionamiento del code.. ya que no aportaste nada con ese post solamente un post mas a tu numero..triste :-( si entiendo el funcionamiento del code lo que hace es enumerar las ventanas mediante un par de apis y dar informacion sobre ellas como el hwnd.. lo que yo quiero saber que no entiendo es como si hay tal ventana en el listview darme el hwnd en un textbox..no entiendo como hacerlo ya que el listview y eso se crea en tiempo de ejecucion las columnas y eso..ya trate con eso EON pero la verdad no he obtenido resultados.. con este codigo si me aprece dicha ventana ya que es un msgbox de una aplicacion aparte muchas gracias salu2
Título: Re: si una ventana esta abierta devolver el hwnd
Publicado por: byebye en 13 Septiembre 2007, 13:27 pm
no es que no lo entienda es que simplemente ni leo ya los codigos que se pegan.
Título: Re: si una ventana esta abierta devolver el hwnd
Publicado por: ~~ en 13 Septiembre 2007, 17:06 pm
por lo que veo vos no entendes el funcionamiento del code.. ya que no aportaste nada con ese post solamente un post mas a tu numero..triste Q se lo digas a otro user, pase, pero a Mek xDD creo q sabe bastante mas q tu y q yo :xD :xD :xD con este codigo si me aprece dicha ventana ya que es un msgbox de una aplicacion aparte Y si pones el nombre exacto del msgbox no te sale? entonces vas a tener q hacer un listado de ventanas hijas de la aplicacion deseada...
Título: Re: si una ventana esta abierta devolver el hwnd
Publicado por: rubeng en 13 Septiembre 2007, 22:42 pm
no sigo con la discusion por que es inutil no terminanos mas ya consegui su hwnd con esto Private Sub Form_Load() Text1.Text = FindWindow(vbNullString, "All rights reserved. Lab Asprise! (c) 1998-2004") End Sub
otra cosa como hago para cerrar o destruir este msgbox o sino pulsar el boton no de este msgbox alguna idea?
Título: Re: si una ventana esta abierta devolver el hwnd
Publicado por: Xerok1! en 13 Septiembre 2007, 23:03 pm
otra cosa como hago para cerrar o destruir este msgbox o sino pulsar el boton no de este msgbox alguna idea?
si envia cn sendkeys la letra "n" XD o si no alt+f4 SendKeys "%{F4}" o enter un saludo :xD
Título: Re: si una ventana esta abierta devolver el hwnd
Publicado por: rubeng en 13 Septiembre 2007, 23:12 pm
eso es muy rustico ademas un msgbox no se cierra con alt f4
Título: Re: si una ventana esta abierta devolver el hwnd
Publicado por: LeandroA en 14 Septiembre 2007, 06:31 am
hola lo que tienes que hacer es enumerar los controles de la ventana y cuando encuetras el texto del control es igual al que buscas significa que ya tienes el hwnd del control luego le pudes enviar el mensage click o enter o como al tener &No le puedes enviar el mensate de la letra N los mensage se envian con SendMessage o PostMessage aca te hice un ejemplo con una funcion para enviar click al algun control de una ventana en la funcion tienes que poner el caption de la ventana y seguido el caption del control En un Modulo Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hWnd As Long) As Long Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hWnd As Long, ByVal Msg As Long, wParam As Any, lParam As Any) As Long Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Const WM_LBUTTONDOWN = &H201 Private Const WM_LBUTTONUP = &H202 Dim lRetValue As Long Dim ControlText As String
Public Function EnumChildProc(ByVal hWnd As Long, ByVal lParam As Long) As Long Dim sSave As String sSave = Space$(GetWindowTextLength(hWnd) + 1) GetWindowText hWnd, sSave, Len(sSave) sSave = Left$(sSave, Len(sSave) - 1) If sSave = ControlText Then lRetValue = PostMessage(hWnd, WM_LBUTTONDOWN, ByVal CLng(0), ByVal CLng(0)) lRetValue = PostMessage(hWnd, WM_LBUTTONUP, ByVal CLng(0), ByVal CLng(0)) End If EnumChildProc = 1 End Function
Public Function MensageClick(WindowsCaption As String, ControlCaption As String) Dim Handle As Long ControlText = ControlCaption Handle = FindWindow(vbNullString, WindowsCaption) If Handle = 0 Then Exit Function EnumChildWindows Handle, AddressOf EnumChildProc, ByVal 0& MensageClick = lRetValue End Function y en el formulario Private Sub Command1_Click() ret = MensageClick("All rights reserved. Lab Asprise! (c) 1998-2004", "&No") MsgBox "Mensage enviado?: " & CBool(ret) End Sub
Te recomiendo para aprender de apis te vajes el Api-guide de la web y vas a ver muchos ejemplos sobre el manejo de estas Saludos
Título: Re: si una ventana esta abierta devolver el hwnd
Publicado por: Xerok1! en 14 Septiembre 2007, 11:53 am
eso es muy rustico ademas un msgbox no se cierra con alt f4 si es un poco rustico,pero no tube tiempo para pensar otra cosa,de todas formas,a mi si me los cierra cn alt f4 :-\ :-\....y si kieres k no cante muxo,mejr q no salte el msgbox.... :¬¬ un saludo :)
Título: Re: si una ventana esta abierta devolver el hwnd
Publicado por: ~~ en 14 Septiembre 2007, 18:06 pm
O lo dejas invisible con showWindow...
Título: Re: si una ventana esta abierta devolver el hwnd
Publicado por: rubeng en 15 Septiembre 2007, 00:38 am
solucionado gracias leandroa! xerok eon y demas.. ¬¬ salu2
|