vaultworld
asked on
After using GetWindowText to list the Child Name how do I gets its position and size
My goal is to get window text, size, position, handle of each child and the parent.
I'm able to get the child using GetWindowText but when I use GetWindowThreadProcessId followed by GetProcessById it breaks down and gives me only the information for the active window
First I call
Public Function EnumWindowsCallBack(ByVal hwnd As IntPtr, ByVal lParam As Int32) As Int32
'Get the windowtext length
sSave = Space(GetWindowTextLength( hwnd) + 1)
'get the window text
GetWindowText(hwnd, sSave, Len(sSave))
'remove the last Chr(0)
sSave = Microsoft.VisualBasic.Left (sSave, Len(sSave) - 1)
And this works to list the windows and all the children
The next step is where my conversion goes wrong and only list the active window
'get the child processID
ProcessID = 0
GetWindowThreadProcessId(h wnd, ProcessID)
If (ProcessID = 0) Then
MessageBox.Show("Error finding target process ID")
Exit Function
End If
Dim tempProc As Process = Process.GetProcessById(Pro cessID)
Dim processName As String = tempProc.ProcessName
If (processName = "iexplore") Then
If (sSave.Length <> 0) Then
'Works
Lst.Items.Add(sSave)
'Doesn't Work
Lst.Items.Add(ProcessID.To String)
Lst.Items.Add(tempProc.Mai nWindowHan dle)
Lst.Items.Add(tempProc.Mai nWindowTit le)
End If
End If
ProcessID.ToString is giving me the same id for children as the active id
mpProc.MainWindowTitle is not giving me the same name as GetWindowText
I'm able to get the child using GetWindowText but when I use GetWindowThreadProcessId followed by GetProcessById it breaks down and gives me only the information for the active window
First I call
Public Function EnumWindowsCallBack(ByVal hwnd As IntPtr, ByVal lParam As Int32) As Int32
'Get the windowtext length
sSave = Space(GetWindowTextLength(
'get the window text
GetWindowText(hwnd, sSave, Len(sSave))
'remove the last Chr(0)
sSave = Microsoft.VisualBasic.Left
And this works to list the windows and all the children
The next step is where my conversion goes wrong and only list the active window
'get the child processID
ProcessID = 0
GetWindowThreadProcessId(h
If (ProcessID = 0) Then
MessageBox.Show("Error finding target process ID")
Exit Function
End If
Dim tempProc As Process = Process.GetProcessById(Pro
Dim processName As String = tempProc.ProcessName
If (processName = "iexplore") Then
If (sSave.Length <> 0) Then
'Works
Lst.Items.Add(sSave)
'Doesn't Work
Lst.Items.Add(ProcessID.To
Lst.Items.Add(tempProc.Mai
Lst.Items.Add(tempProc.Mai
End If
End If
ProcessID.ToString is giving me the same id for children as the active id
mpProc.MainWindowTitle is not giving me the same name as GetWindowText
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Lst = ListBox1 '--------> ADD THIS LINE
EnumWindows(AddressOf EnumWindowsCallBack, 0)
End Sub
End Class
Module Module1
Private Declare Auto Function GetWindowThreadProcessId Lib "user32.dll" (ByVal hWnd As IntPtr, ByRef ProcessID As Integer) As Integer
Public Lst As ListBox
Public Delegate Function EnumWindowsProc(ByVal hwnd As IntPtr, ByVal lParam As Int32) As Int32
Public Declare Function EnumWindows Lib "user32.dll" (ByVal lpEnumFunc As EnumWindowsProc, ByVal lParam As Int32) As Int32
Public Declare Function GetWindowTextLength Lib "user32.dll" Alias "GetWindowTextLengthA" (ByVal hwnd As IntPtr) As Int32
Public Declare Function GetWindowText Lib "user32.dll" Alias "GetWindowTextA" (ByVal hwnd As IntPtr, ByVal lpString As String, ByVal cch As Int32) As Int32
'Callback function to enum windows
Public Function EnumWindowsCallBack(ByVal hwnd As IntPtr, ByVal lParam As Int32) As Int32
Dim sSave As String
Dim ProcessID As Long
'Get the windowtext length
sSave = Space(GetWindowTextLength(hwnd) + 1)
'get the window text
GetWindowText(hwnd, sSave, Len(sSave))
'remove the last Chr(0)
sSave = Microsoft.VisualBasic.Left(sSave, Len(sSave) - 1)
'get the child processID
ProcessID = 0
GetWindowThreadProcessId(hwnd, ProcessID)
If (ProcessID = 0) Then
MessageBox.Show("Error finding target process ID")
Exit Function
End If
Dim tempProc As Process = Process.GetProcessById(ProcessID)
Dim processName As String = tempProc.ProcessName
If (processName = "iexplore") Then
If (sSave.Length <> 0) Then
Lst.Items.Add(sSave)
Lst.Items.Add(ProcessID.ToString)
Lst.Items.Add(tempProc.MainWindowHandle)
Lst.Items.Add(tempProc.MainWindowTitle)
End If
End If
If sSave.Trim <> "" Then
Debug.WriteLine(sSave)
End If
Return 1 'continue enumeration
End Function
End Module
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
I think I left out size, but anyway....
ASKER
I was doing a little more research and that looks to be it exactly. THanks again for your time.
He's working with EXTERNAL windows ladarling... =)
Ahhh, sorry. Attention to detail.. for me that means 'check out the exception call stack" lol.
:-)
:-)
Why not just use something like:
Open in new window