Solved

X,Y coordinates of a window

Posted on 2008-06-13
8
330 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
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.

 
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

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.

Question has a verified solution.

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

A long time ago (May 2011), I have written an article showing you how to create a DLL using Visual Studio 2005 to be hosted in SQL Server 2005. That was valid at that time and it is still valid if you are still using these versions. You can still re…
Background What I'm presenting in this article is the result of 2 conditions in my work area: We have a SQL Server production environment but no development or test environment; andWe have an MS Access front end using tables in SQL Server but we a…
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…
Show developers how to use a criteria form to limit the data that appears on an Access report. It is a common requirement that users can specify the criteria for a report at runtime. The easiest way to accomplish this is using a criteria form that a…

785 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