Autor Tema: problema con findwindow y findwindowex  (Leído 5397 veces)

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

xmbeat

  • Kilobyte
  • **
  • Mensajes: 84
  • Reputación: +3/-1
  • la vida no tiene sentido sin Dios
    • Ver Perfil
problema con findwindow y findwindowex
« en: Enero 22, 2010, 04:22:59 pm »
Bien, mi problema es que quiero sacar el HWND de un control en especifico de la barra de tareas, con el findwindow busco la barra de tareas, y con el el findwindowex busco el control hijo, todo va bien pero no puedo acceder a los controles hijos del mismo control hijo, bueno es que dentro de la barra de tareas tenemos varios controles que pude identificar: El Boton "Inicio"(BUTTON), El "ReBarWindow32", el "TrayNotifyWnd".
Adentro del ReBarWindow32 existe un control hijo llamado "ToolbarWindow32", ademas de que el TrayNotifyWnd tambien tiene sus controles hijos, pero en especial quiero el ToolbarWindow32 del ReBarWindow32, el codigo que uso es este pero el findwindowex me retorna 0 despues de que quiero buscar el Handle del ToolbarWindow32:

Código: [Seleccionar]
Private Sub Command1_Click()
Dim Papa As Long
Dim Abuelo As Long
Dim Hijo as long
Abuelo = FindWindow("Shell_TrayWnd", "")
Papa = FindWindowEx(Abuelo, 0, "ReBarWindow32", vbNullString)
'hasta aqui esta bien despues no
Hijo = FindWindowEx(Papa, 0, "ToolbarWindow32",vbNullString)
'Hijo me sale a cero, no se porque
End Sub

Estoy seguro que si es la clase correcta, y que si es su hijo, ya que hice un programita que me pinta el objeto segun el WindowFromPoint, me dice su clase, y su handle. Despues copio el handle de la clase "ToolbarWindow32" y la uso con el Api isChild y me da que si es Hijo. Aqui dejo el Code del programa para que vean que es cierto:

Código: [Seleccionar]


'SE OCUPA UN PICTURE, DOS TEXBOX Y UN TIMER
Private Type Coord
    X As Long
    Y As Long
End Type
Private Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long

Private Declare Sub GetCursorPos Lib "user32" (Cordenada As Coord)
Private Declare Function WindowFromPoint Lib "user32" (ByVal CordenadaX As Long, ByVal CordenadaY As Long) As Long
Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal HDC As Long) As Long
Private Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal HDC As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal HDC As Long, ByVal hObject As Long) As Long
Private Declare Function DeleteDC Lib "gdi32" (ByVal HDC As Long) As Long
Private Declare Function DeleteObject Lib "gdi32.dll" (ByVal hObject As Long) As Long
Private Declare Function PrintWindow Lib "user32" (ByVal hwnd As Long, ByVal hdcBlt As Long, ByVal nFlags As Long) As Long
Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function StretchBlt Lib "gdi32" (ByVal HDC As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long
Private Declare Function SetStretchBltMode Lib "gdi32" (ByVal HDC As Long, ByVal nStretchMode As Long) As Long
Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, Rects As RECT) As Long

Private Sub Timer1_Timer()
Dim p As Coord
Dim WFP As Long
Static L As Long
Dim DC As Long
Dim HDC  As Long
Dim HBMP As Long
Dim R As RECT
Static E As Boolean
Dim X As Long
Dim S As String
GetCursorPos p
WFP = WindowFromPoint(p.X, p.Y)

If WFP = L Or WFP = 65702 Then
    Exit Sub
Else
    Text1.Text = WFP
    S = Space(256)
    X = GetClassName(WFP, S, 256)
    S = Left(S, X)
    Text2.Text = S
    Me.Caption = S & "  " & WFP
    L = WFP
    GetWindowRect L, R
    W = R.Right - R.Left
    H = R.Bottom - R.Top
    DC = GetDC(0)
    HDC = CreateCompatibleDC(0)
    HBMP = CreateCompatibleBitmap(DC, W, H)
    SelectObject HDC, HBMP
    PrintWindow WFP, HDC, 0
    StretchBlt Me.Picture1.HDC, 0, 0, Picture1.ScaleWidth, Picture1.ScaleHeight, _
    HDC, 0, 0, W, H, vbSrcCopy
    Picture1.Refresh
    DeleteDC HDC
    DeleteObject HBMP
    DeleteDC DC
End If
End Sub





PORFAVOR AYUDA
« última modificación: Enero 22, 2010, 04:25:14 pm por xmbeat »
El hombre encuentra a Dios detrás de cada puerta que la ciencia logra abrir. -Einstein

ssccaann43

  • Terabyte
  • *****
  • Mensajes: 970
  • Reputación: +97/-58
    • Ver Perfil
    • Sistemas Nuñez, Consultores y Soporte, C.A.
Miguel Núñez.

xmbeat

  • Kilobyte
  • **
  • Mensajes: 84
  • Reputación: +3/-1
  • la vida no tiene sentido sin Dios
    • Ver Perfil
Re:problema con findwindow y findwindowex
« Respuesta #2 en: Enero 22, 2010, 05:01:36 pm »
PUES LO LEI PERO CREO QUE NO ENTENDISTE BIEN, ES QUE YO QUIERO EL HWND DE ESE CONTROL HIJO POR MEDIO DEL FINDWINDOW, YA QUE COMO PUEDES VER LO PUEDO SACAR POR MEDIO DEL WINDOWFROMPOINT, LA VERDAD ES QUE A ESE CONTROL HIJO LO QUIERO EDITAR PARA FINES DE UN CONTROL DE USUARIO QUE ESTOY HACIENDO
El hombre encuentra a Dios detrás de cada puerta que la ciencia logra abrir. -Einstein

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1128
  • Reputación: +151/-8
    • Ver Perfil
Re:problema con findwindow y findwindowex
« Respuesta #3 en: Enero 23, 2010, 01:19:31 am »
hola te esta faltando "MsTaskSwWClass" este es el orden

ToolbarWindow32
MsTaskSwWClass
ReBarWindow32
Shell_TrayWnd

un ejemplo de como obtener todas las ventanas en forma de arbol
Código: [Seleccionar]
Option Explicit
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 Declare Function GetParent Lib "user32" (ByVal hwnd 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 GetWindowLong Lib "user32.dll" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Const GWL_ID As Long = -12

Private Type POINTAPI
    x As Long
    y As Long
End Type


Private Sub Timer1_Timer()
    Dim PT As POINTAPI
    Dim hChild As Long, hParent As Long
    GetCursorPos PT
    hChild = WindowFromPoint(PT.x, PT.y)
    Me.Cls
    Me.Print hChild, fGetClassName(hChild), GetWindowID(hChild)
   
    hParent = GetParent(hChild)
   
    Do While hParent <> 0
        Me.Print hParent, fGetClassName(hParent), GetWindowID(hParent)
        hParent = GetParent(hParent)
    Loop

End Sub

Private Function fGetClassName(ByVal hwnd As Long) As String
    Dim Ret As Long, sClass As String
    sClass = Space(256)
    Ret = GetClassName(hwnd, sClass, 256)
    fGetClassName = Left(sClass, Ret)
End Function

Private Function GetWindowID(ByVal hwnd As Long) As Long
    GetWindowID = GetWindowLong(hwnd, GWL_ID)
End Function

fuera el caso que vos tenes dos ventanas con el mismo classname podes utilizar GetWindowLong + GWL_ID, si las ventanas no son creadas dinamiacamente utilizas ese id, para enumerar las ventanas utiliza EnumChildWindows

Saludos.

xmbeat

  • Kilobyte
  • **
  • Mensajes: 84
  • Reputación: +3/-1
  • la vida no tiene sentido sin Dios
    • Ver Perfil
Re:problema con findwindow y findwindowex
« Respuesta #4 en: Enero 25, 2010, 10:49:32 pm »
perfecto, gracias
« última modificación: Enero 26, 2010, 11:57:27 pm por xmbeat »
El hombre encuentra a Dios detrás de cada puerta que la ciencia logra abrir. -Einstein