Saltar al contenido

Identificar las ventanas de Windows


Ferjam

Recommended Posts

publicado

Buenas,  es una cosa fácil pero se me esta resistiendo, con Application.hWnd saco la de la ventana activa, el excel, y con FindWindow("notepad", vbNullString), la de notepad, pero cuando intento otras que tengo activas como por ejemplo el word no me da nada... alguien me puede indicar como indicar en el findwindow / ex el titulo de la ventana, gracias

publicado

os pongo un poco de codigo...

Public Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Sub run()

note = FindWindow("notepad", vbNullString) ' sin problem me detecta la pantalla
inter = FindWindow("IEFrame", vbNullString)  ' sin problem me detecta la pantalla del explorer
team = FindWindow("teams", vbNullString)  ' no hay manera de que la vea, me da 0 (no se como poner el titulo de la pantalla que quiero)

Range("a1") = note
Range("b1") = "note"

Range("a3") = inter
Range("b3") = "interNET"

Range("a5") = team
Range("b5") = "teams"

Range("a7") = Application.hWnd


Range("b7") = "exel"

End Sub

En 24/11/2020 at 10:56 , Ferjam dijo:

Buenas,  es una cosa fácil pero se me esta resistiendo, con Application.hWnd saco la de la ventana activa, el excel, y con FindWindow("notepad", vbNullString), la de notepad, pero cuando intento otras que tengo activas como por ejemplo el word no me da nada... alguien me puede indicar como indicar en el findwindow / ex el titulo de la ventana, gracias

publicado

Una solución... buscando he entrado un código que me da el hwnd de todas las aplicaciones abiertas... 

Option Explicit
 
 
 'PtrSafe
 
Private 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
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 GetWindowText Lib "user32" Alias "GetWindowTextA" _
(ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
 
Private x As Integer
 
Private Enum winOutputType
    winHandle = 0
    winClass = 1
    winTitle = 2
    winHandleClass = 3
    winHandleTitle = 4
    winHandleClassTitle = 5
End Enum
 
Public Sub GetWindows()
    x = 0
    GetWinInfo 0&, 0, winHandleClassTitle
End Sub
 
 
Private Sub GetWinInfo(hParent As Long, intOffset As Integer, OutputType As winOutputType)
     'Sub to recursively obtain window handles, classes and text
     'given a parent window to search
     'Written by Mark Rowlinson
     'www.markrowlison.co.uk - The Programming Emporium
    Dim hWnd As Long, lngRet As Long, y As Integer
    Dim strText As String
    hWnd = FindWindowEx(hParent, 0&, vbNullString, vbNullString)
    While hWnd <> 0
        Select Case OutputType
        Case winOutputType.winClass
            strText = String$(100, Chr$(0))
            lngRet = GetClassName(hWnd, strText, 100)
            Range("a1").Offset(x, intOffset) = Left$(strText, lngRet)
        Case winOutputType.winHandle
            Range("a1").Offset(x, intOffset) = hWnd
        Case winOutputType.winTitle
            strText = String$(100, Chr$(0))
            lngRet = GetWindowText(hWnd, strText, 100)
            If lngRet > 0 Then
                Range("a1").Offset(x, intOffset) = Left$(strText, lngRet)
            Else
                Range("a1").Offset(x, intOffset) = "N/A"
            End If
        Case winOutputType.winHandleClass
            Range("a1").Offset(x, intOffset) = hWnd
            strText = String$(100, Chr$(0))
            lngRet = GetClassName(hWnd, strText, 100)
            Range("a1").Offset(x, intOffset + 1) = Left$(strText, lngRet)
        Case winOutputType.winHandleTitle
            Range("a1").Offset(x, intOffset) = hWnd
            strText = String$(100, Chr$(0))
            lngRet = GetWindowText(hWnd, strText, 100)
            If lngRet > 0 Then
                Range("a1").Offset(x, intOffset + 1) = Left$(strText, lngRet)
            Else
                Range("a1").Offset(x, intOffset + 1) = "N/A"
            End If
        Case winOutputType.winHandleClassTitle
            Range("a1").Offset(x, intOffset) = hWnd
            strText = String$(100, Chr$(0))
            lngRet = GetClassName(hWnd, strText, 100)
            Range("a1").Offset(x, intOffset + 1) = Left$(strText, lngRet)
            strText = String$(100, Chr$(0))
            lngRet = GetWindowText(hWnd, strText, 100)
            If lngRet > 0 Then
                Range("a1").Offset(x, intOffset + 2) = Left$(strText, lngRet)
            Else
                Range("a1").Offset(x, intOffset + 2) = "N/A"
            End If
        End Select
         'check for children
        y = x
        Select Case OutputType
        Case Is > 4
            GetWinInfo hWnd, intOffset + 3, OutputType
        Case Is > 2
            GetWinInfo hWnd, intOffset + 2, OutputType
        Case Else
            GetWinInfo hWnd, intOffset + 1, OutputType
        End Select
         'increment by 1 row if no children found (added from above article to remove blank lines)
        If y = x Then
            x = x + 1
        End If
         'now get next window
        hWnd = FindWindowEx(hParent, hWnd, vbNullString, vbNullString)
    Wend
     
End Sub 

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.