Visual Basic Screen Resolution Changes

Posted on 2011-04-21
Last Modified: 2012-05-11
I have got everything to work just perfect on my monitor, but when I tested it on another monitor the coordinates are off. I did some searching and see that there is some math involved. I don't know what part of the code you need to see, if I need to post all of it just let me know.
Question by:Jack_Jones
    LVL 1

    Author Comment

    The coordinates for the pixel detection, mouse coords seem to be ok. I am not sure how to word this perfectly.
    LVL 1

    Author Comment

    I take it back on a test computer, the mouse and pixels are off.
    LVL 14

    Expert Comment

    Can you explain what you are trying to do, whats not working, and then post the code for that part of the application?
    LVL 1

    Author Comment

    If it helps, my screen resolution is 1680 x 1050.

    Other system needed to work on is 1056 x 825
    LVL 1

    Author Comment

    Here is the code, my computer uses 1680 x 1050 that I used to develop this program on. The host computers use 1056 x 825. Rather than change my display, is it possible to just have the program do the changes?

    Imports System.Runtime.InteropServices
    Imports System.Windows.Forms
    Imports System.Drawing
    Imports System
    Imports System.Threading
    Imports System.Diagnostics
    Public Class Form1
        Private slowmode As Boolean = False
        Dim MyProcess As Process
        'Load Ccleaner
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            MoveMouseTo(Panel1.PointToScreen(New Point(895, 288)))
            Do While True
                Dim HandleColor As String = "#31AB4E"
                Dim pt As New Point(Panel1.PointToScreen(New Point(136, 174)))
                Dim clr As Color = System.Drawing.ColorTranslator.FromHtml(HandleColor)
                If IsColorAt(pt, clr) = True Then
                    Label3.Text = "Scan Complete"
                    Label3.Text = "System Scanning"
                End If
        End Sub
        'Grab the window to panel1
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            Dim FHandle As IntPtr
            FHandle = FindWindow("msseces_class", Nothing)
            SetParent(FHandle, Panel1.Handle)
        End Sub
        <DllImport("user32.dll", CharSet:=CharSet.Auto, SetLastError:=False)> _
        Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As UInteger, ByVal wParam As IntPtr, _
                                              ByVal lParam As IntPtr) As IntPtr
        End Function
        <System.Runtime.InteropServices.DllImport("USER32.DLL", CharSet:=System.Runtime.InteropServices.CharSet.Auto)> _
        Private Shared Function FindWindow(ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
        End Function
        <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
        Public Shared Function SetParent(ByVal hWndChild As IntPtr, ByVal hWndNewParent As IntPtr) As IntPtr
        End Function
        Private Sub MoveMouseTo(ByVal targetPT As Point)
            Dim startPT As Point = Cursor.Position
            Dim distance As Single = PointToPointDist(startPT.X, startPT.Y, targetPT.X, targetPT.Y)
            Dim duration As Single = distance / 400 * 1000
            Dim startDT As DateTime = DateTime.Now
            Dim targetDT As DateTime = DateTime.Now.AddMilliseconds(duration)
            Dim percent As Single
            While DateTime.Now <= targetDT
                percent = DateTime.Now.Subtract(startDT).TotalMilliseconds / duration
                Cursor.Position = New Point(startPT.X + (targetPT.X - startPT.X) * percent, startPT.Y + (targetPT.Y - startPT.Y) * percent)
            End While
            Cursor.Position = targetPT
        End Sub
        Private Function PointToPointDist(ByVal Ax As Single, ByVal Ay As Single, ByVal Bx As Single, ByVal By As Single) As Single
            ' PointToPointDist = SquareRoot((Bx - Ax)^2 + (By - Ay)^2)
            Return Math.Sqrt((Bx - Ax) * (Bx - Ax) + (By - Ay) * (By - Ay))
        End Function
        Private Sub Delay(ByVal DelayInSeconds As Integer)
            Dim targetDT As DateTime = DateTime.Now.Add(TimeSpan.FromSeconds(DelayInSeconds))
            While targetDT > DateTime.Now
                System.Threading.Thread.Sleep(50) ' <-- very SMALL delay
                Application.DoEvents() ' <-- keep UI responsive
            End While
        End Sub
        Private Function IsColorAt(ByVal pt As Point, ByVal clr As Color) As Boolean
            Dim bmp As New Bitmap(1, 1)
            Using G As Graphics = Graphics.FromImage(bmp)
                G.CopyFromScreen(pt, New Point(0, 0), bmp.Size)
            End Using
            Return bmp.GetPixel(0, 0).Equals(clr)
        End Function
        Public Class Clicked
            Public Declare Sub mouse_event Lib "user32" Alias "mouse_event" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
            Public Const MOUSEEVENTF_LEFTDOWN = &H2 ' left button down 
            Public Const MOUSEEVENTF_LEFTUP = &H4 ' left button up 
            Public Const MOUSEEVENTF_RIGHTDOWN = &H8 ' right button down 
            Public Const MOUSEEVENTF_RIGHTUP = &H10 ' right button up 
            Public Shared Sub LeftDown()
                mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
            End Sub
            Public Shared Sub LeftUp()
                mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
            End Sub
            Public Shared Sub RightDown()
                mouse_event(MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0)
            End Sub
            Public Shared Sub RightUp()
                mouse_event(MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0)
            End Sub
        End Class
    End Class

    Open in new window

    LVL 1

    Author Comment

    Where you at Idle_Mind... I have been searching still trying to find a good resolution to this but no luck so far.
    LVL 85

    Accepted Solution

    Lol...not sure how to solve the resolution issue.

    Personally, though, I wouldn't automate a process like this using coords and mouse clicks.  =\

    It's a lot more difficult to code, but I would use windows handles and SendMessage() to automate the process.  You'd use things like FindWindow()/FindWindowEx() and/or EnumWindows()/EnumChildWindows() instead.

    Would love to provide some examples but I've got to ferry kids off to Soccer and Tae Kwon Do!  =)
    LVL 1

    Author Comment

    Sounds good, I will be here when you return ;). I have my daughters 7'th bday today, so we going over wife's parents for cake / icecream ;).  I will be back later as well.
    LVL 1

    Author Closing Comment

    Idle, thanks again! Once I get more time I will look further into it. I did some pokeing around and found that this will work just need to play with it. If I find any problems I will post another questions. Thanks Man

    You'd use things like FindWindow()/FindWindowEx() and/or EnumWindows()/EnumChildWindows() instead.

    Featured Post

    How to run any project with ease

    Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
    - Combine task lists, docs, spreadsheets, and chat in one
    - View and edit from mobile/offline
    - Cut down on emails

    Join & Write a Comment

    This tutorial demonstrates one way to create an application that runs without any Forms but still has a GUI presence via an Icon in the System Tray. The magic lies in Inheriting from the ApplicationContext Class and passing that to Application.Ru…
    Introduction As chip makers focus on adding processor cores over increasing clock speed, developers need to utilize the features of modern CPUs.  One of the ways we can do this is by implementing parallel algorithms in our software.   One recent…
    It is a freely distributed piece of software for such tasks as photo retouching, image composition and image authoring. It works on many operating systems, in many languages.
    Sending a Secure fax is easy with eFax Corporate ( First, Just open a new email message.  In the To field, type your recipient's fax number You can even send a secure international fax — just include t…

    732 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

    17 Experts available now in Live!

    Get 1:1 Help Now