Solved

X,Y coordinates of a window

Posted on 2008-06-13
8
331 Views
Last Modified: 2008-06-13
Hi
I need some way of knowing the x & y location of a window (which is not in my own application). For example, a popup window from which i wan't to extract the color. I have used
  Private Declare Auto Function FindWindow Lib "user32" ()
to locate the window for which i need to know the x & y coordinates, but after that it got complicated.

Any thoughts ?
0
Comment
Question by:soriega
  • 3
  • 3
  • 2
8 Comments
 
LVL 10

Expert Comment

by:Clif
ID: 21780776
Something like this?


Structure RECT
       Public Left As Long
       Public Top As Long
       Public Right As Long
       Public Bottom As Long
End Structure
 
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
   Private Declare Function GetWindowRect Lib "user32" Alias "GetWindowRect" (ByVal hwnd As Long, ByVal lpRect As RECT) As Long
 
Private Sub MoveIt_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MoveIt.Click
       Dim NotepadRect As RECT
       Dim NotepadHandle As Long
 
       NotepadHandle = FindWindow("Notepad", "Untitled - Notepad")
 
       ' ERROR IS ON THE NEXT LINE!!
       GetWindowRect(NotepadHandle, NotepadRect)
       MsgBox("Top = " & NotepadRect.Top & _
           vbCrLf & "Bottom = " & NotepadRect.Bottom & _
           vbCrLf & "Left = " & NotepadRect.Left & _
           vbCrLf & "Right = " & NotepadRect.Right)
End Sub

Open in new window

0
 

Author Comment

by:soriega
ID: 21780884
I get this errormessage:
System.AccessViolationException was unhandled
  Message="Attempted to read or write protected memory. This is often an indication that other memory is corrupt."
0
 
LVL 10

Expert Comment

by:Clif
ID: 21780965
Oops.  Sorry, I gave you the error version (This is just not my day.  It's like it's Friday the 13th, or something).

Try the following:

Option Explicit
Private Type RECT
        Left As Long
        Top As Long
        Right As Long
        Bottom As Long
End Type
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
 
Private Sub Command1_Click()
       Dim NotepadRect As RECT
       Dim NotepadHandle As Long
 
       NotepadHandle = FindWindow("Notepad", "Untitled - Notepad")
 
       GetWindowRect NotepadHandle, NotepadRect
       MsgBox ("Top = " & NotepadRect.Top & _
           vbCrLf & "Bottom = " & NotepadRect.Bottom & _
           vbCrLf & "Left = " & NotepadRect.Left & _
           vbCrLf & "Right = " & NotepadRect.Right)
End Sub

Open in new window

0
Master Your Team's Linux and Cloud Stack!

The average business loses $13.5M per year to ineffective training (per 1,000 employees). Keep ahead of the competition and combine in-person quality with online cost and flexibility by training with Linux Academy.

 
LVL 85

Expert Comment

by:Mike Tomlinson
ID: 21780967
If you're using VB.Net then you need to change all occurences of "Long" to "Integer".
0
 

Author Comment

by:soriega
ID: 21781059
This doesn't work in my visual studio 2005, it instructs me to use "structure" instead

Private Type RECT
        Left As Long
        Top As Long
        Right As Long
        Bottom As Long
End Type
0
 
LVL 85

Expert Comment

by:Mike Tomlinson
ID: 21781108
The code he gave you is for VB6...

For VB.Net:
    Public Structure RECT
        Public Left As Integer
        Public Top As Integer
        Public Right As Integer
        Public Bottom As Integer
    End Structure
 
    Private Declare Function GetWindowRect Lib "user32" Alias "GetWindowRect" (ByVal hWnd As IntPtr, ByRef lpRect As RECT) As Integer
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim r As RECT
        Call GetWindowRect(Me.Handle, r)
        Debug.WriteLine("Left = " & r.Left)
        Debug.WriteLine("Top = " & r.Top)
        Debug.WriteLine("Right = " & r.Right)
        Debug.WriteLine("Bottom = " & r.Bottom)
    End Sub

Open in new window

0
 
LVL 10

Accepted Solution

by:
Clif earned 150 total points
ID: 21781188
Sorry (again) I missed that you were using VB.Net

One last time (withfeeling):
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
    Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Integer, ByRef lpRect As RECT) As Integer
    Private Structure RECT
        Dim RectLeft As Integer
        Dim RectTop As Integer
        Dim RectRight As Integer
        Dim RectBottom As Integer
    End Structure
 
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim NotepadRect As RECT
        Dim NotepadHandle As Integer
 
        NotepadHandle = FindWindow("Notepad", "Untitled - Notepad")
 
        GetWindowRect(NotepadHandle, NotepadRect)
        MsgBox("Top = " & NotepadRect.RectTop & vbCrLf & "Bottom = " & NotepadRect.RectBottom & vbCrLf & "Left = " & NotepadRect.RectLeft & vbCrLf & "Right = " & NotepadRect.RectRight)
    End Sub

Open in new window

0
 

Author Comment

by:soriega
ID: 21781248
That seems to be the solution, i will just have to test it on my "popupscreen", works fine on notepad though. Great Work! thanks
0

Featured Post

Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

When trying to find the cause of a problem in VBA or VB6 it's often valuable to know what procedures were executed prior to the error. You can use the Call Stack for that but it is often inadequate because it may show procedures you aren't intereste…
Real-time is more about the business, not the technology. In day-to-day life, to make real-time decisions like buying or investing, business needs the latest information(e.g. Gold Rate/Stock Rate). Unlike traditional days, you need not wait for a fe…
As developers, we are not limited to the functions provided by the VBA language. In addition, we can call the functions that are part of the Windows operating system. These functions are part of the Windows API (Application Programming Interface). U…
Get people started with the process of using Access VBA to control Outlook using automation, Microsoft Access can control other applications. An example is the ability to programmatically talk to Microsoft Outlook. Using automation, an Access applic…

792 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question