Solved

X,Y coordinates of a window

Posted on 2008-06-13
8
327 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
 
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
3 Use Cases for Connected Systems

Our Dev teams are like yours. They’re continually cranking out code for new features/bugs fixes, testing, deploying, testing some more, responding to production monitoring events and more. It’s complex. So, we thought you’d like to see what’s working for us.

 

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

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

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

Article by: Martin
Here are a few simple, working, games that you can use as-is or as the basis for your own games. Tic-Tac-Toe This is one of the simplest of all games.   The game allows for a choice of who goes first and keeps track of the number of wins for…
If you need to start windows update installation remotely or as a scheduled task you will find this very helpful.
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…
Get people started with the utilization of class modules. Class modules can be a powerful tool in Microsoft Access. They allow you to create self-contained objects that encapsulate functionality. They can easily hide the complexity of a process from…

911 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

Need Help in Real-Time?

Connect with top rated Experts

18 Experts available now in Live!

Get 1:1 Help Now