VBS send mouse clicks?

后端 未结 5 2043
陌清茗
陌清茗 2020-12-18 12:58

I need send mouse clicks from VBS. Like SendKeys. I have searched whole google, it seems there is no such function for VBS. Can you give me some solution?

相关标签:
5条回答
  • 2020-12-18 13:33

    It's not possible with VBScript alone. You'll need to use a third-party tool like nircmd. You can use its setcursor, setcursorwin, movecursor, and sendmouse commands to manipulate the mouse.

    For example, here's how to move the cursor to a screen coordinate (measured from the top left) and perform a right-click:

    With CreateObject("WScript.Shell")
        .Run "nircmd setcursor 100 100", 0, True
        .Run "nircmd sendmouse right click", 0, True
    End With
    

    See the documentation for parameter information.

    0 讨论(0)
  • 2020-12-18 13:34

    Try

     Dim x
     set x=createobject("wscript.shell")
    
     x.sendkeys"{CLICK LEFT,50,60}"
    

    or

     x.SendKeys("+{F10}") 'for a right click
    

    If neither of those work for you I would suggest using something like Autoit or autohotkey, using AutoHotKey you could write a macro that does the clicking and then call the script from your VBScript.

    0 讨论(0)
  • 2020-12-18 13:45

    Here is a routine to send a left or right click to a window (using relative references) in VBA for Excel. Similar to AppActivate, you just need the window title.

    The arguments when you call the SendClick routine are:

    • Window Title (String)
    • Buttons (1 = Left, 2 = Right, -1 = Move mouse only; no click)
    • x (Relative position to window Left)
    • y (Relative position to window Top)

    Enjoy!

    'Declare mouse events
    Public Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
    Public Declare Sub mouse_event Lib "user32" (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
    Public Const MOUSEEVENTF_LEFTUP = &H4
    Public Const MOUSEEVENTF_RIGHTDOWN As Long = &H8
    Public Const MOUSEEVENTF_RIGHTUP As Long = &H10
    'Declare sleep
    Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    
    ' Window location
    Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Public Declare Function GetWindowRect Lib "user32" (ByVal hWnd As Long, lpRect As RECT) As Long
    Type RECT
      Left As Long
      Top As Long
      Right As Long
      Bottom As Long
    End Type
    
    Public Function WindowHandle(ByVal sTitle As String) As Long
        WindowHandle = FindWindow(vbNullString, sTitle)
    End Function
    
    Public Sub SendClick(sWnd As String, b As Integer, x As Long, y As Long)
        Dim pWnd As Long, pRec As RECT
    
        pWnd = WindowHandle(sWnd)
        GetWindowRect pWnd, pRec
    
        SetCursorPos pRec.Left + x, pRec.Top + y
        Sleep 50
        If b = 2 Then
            mouse_event MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0
            Sleep 50
            mouse_event MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0
        ElseIf b <> -1 Then
            mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0
            Sleep 50
            mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
        End If
    End Sub
    
    0 讨论(0)
  • 2020-12-18 13:47

    VBS is a script, not an application; VBScripts can call other applications or Component Objects to access elements of the host environment, just like batch files; eg. FileSystemObject to manipulate files.

    There isn't one provided for mouse, so to move mouse or send mouse clicks, you'd need to call some app or COM object to do it, or make one.
    Some apps that can manipulate the mouse are MSWord & MSExcel (via WinAPI calls), NirCmd, AutoIt, AutoHotKey, etc

    Here's a VBApp example that calls functions of the User Component: user32.dll:

    (Notice how the arguments are formatted before being sent to the DLL. This is not possible in VBS or batch files since they can only pass Strings as args; some functions expect data types eg. Int32, window handles or object references)

    Option Strict On
    Option Explicit On
    Option Infer On
    
    Imports System.Runtime.InteropServices
    
    Public Class Mousing
        Private Declare Auto Sub mouse_event Lib "user32" (ByVal dwFlags As Int32, ByVal dx As Int32, ByVal dy As Int32, ByVal cButtons As Int32, ByVal dwExtraInfo As IntPtr)
        Private Const MOUSEEVENTF_LEFTDOWN As Int32 = &H2
        Private Const MOUSEEVENTF_LEFTUP As Int32 = &H4
        Private Const MOUSEEVENTF_RIGHTDOWN As Long = &H8
        Private Const MOUSEEVENTF_RIGHTUP As Long = &H10
    
    
        <StructLayout(LayoutKind.Sequential)>
        Private Structure RECT
            Public Left As Integer
            Public Top As Integer
            Public Right As Integer
            Public Bottom As Integer
        End Structure
    
        <DllImport("user32.dll")> _
        Private Shared Function GetWindowRect(ByVal hWnd As IntPtr, ByRef lpRect As RECT) As Boolean
        End Function
    
        <DllImport("user32.dll", CharSet:=CharSet.Auto, EntryPoint:="FindWindow")> _
        Private Shared Function FindWindow(ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
        End Function
    
        <DllImport("user32.dll", CharSet:=CharSet.Ansi, SetLastError:=True, ExactSpelling:=True)> _
        Private Shared Function SetForegroundWindow(ByVal hwnd As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
        End Function
    
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            ' find the window 
            Dim hWnd As IntPtr = FindWindow(Nothing, "Some Window")
            ' check if window found
            If hWnd.Equals(IntPtr.Zero) Then
                MessageBox.Show("Window Not Found!", "Aborting", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                Return ' exit
            Else
                ' bring the window to the foreground
                SetForegroundWindow(hWnd)
    
                ' get the windows size and location
                Dim r As New RECT
                GetWindowRect(hWnd, r)
    
                'Move the cursor to the windows location plus our offset (x + 50 , y + 100)
                Windows.Forms.Cursor.Position = New System.Drawing.Point(r.Left + 50, r.Top + 100)
            ' To move relative to screen, just enter coordinates above without offsetting
    
               ' click the left mouse button at the current mouse position
                mouse_event(MOUSEEVENTF_LEFTDOWN + MOUSEEVENTF_LEFTUP, 0, 0, 0, IntPtr.Zero)
            End If
        End Sub
    
    End Class
    

    The following is a VBScript calling AutoIt to move mouse & click:

    Set oAutoIt = WScript.CreateObject("AutoItX.Control")
    set oShell = CreateObject("WScript.Shell")
    oAutoIt.MouseMove x,y,0
    WScript.Sleep 500
    oAutoIt.MouseClick($MOUSE_CLICK_PRIMARY)
    

    References:
    http://www.vbforums.com/showthread.php?672196-RESOLVED-SetCursorPos
    http://www.ericphelps.com/batch/rundll/
    https://www.dostips.com/forum/viewtopic.php?t=3931
    https://support.microsoft.com/en-au/help/152969/visual-basic-procedure-to-get-set-cursor-position
    https://microsoft.public.scripting.vbscript.narkive.com/ZO09Cxnz/moving-mouse-pointer-with-vbs-file

    0 讨论(0)
  • 2020-12-18 13:50

    If you want to send keys then its easy type this in notepad and save it as VBS

    Set WshShell = WScript.CreateObject("WScript.Shell")
    Bracket=")"
    WshShell.SendKeys ":"
    WshShell.SendKeys "{"&Bracket&"}"
    WshShell.SendKeys "{ENTER}"
    

    If you want it to send different keys then basicly at the 5th line edit the enter so it can be like these example

    Backspace
    {BACKSPACE}, {BKSP} or {BS}
    Break
    {BREAK}
    Caps Lock
    {CAPSLOCK}
    Delete
    {DELETE} or {DEL}
    Down Arrow
    {DOWN}
    End
    {END}
    Enter
    {ENTER} or ~
    Escape
    {ESC}
    Help
    {HELP}
    Home
    {HOME}
    Insert
    {INSERT} or {INS}
    Left Arrow
    {LEFT}
    Num Lock
    {NUMLOCK}
    Page Down
    {PGDN}
    Page Up
    {PGUP}
    Print Screen
    {PRTSC}
    Right Arrow
    {RIGHT}
    Scroll Lock
    {SCROLLLOCK}
    Tab
    {TAB}
    Up Arrow
    {UP}
    F1
    {F1}
    F2
    {F2}
    F3
    {F3}
    F4
    {F4}
    F5
    {F5}
    F6
    {F6}
    F7
    {F7}
    F8
    {F8}
    F9
    {F9}
    F10
    {F10}
    F11
    {F11}
    F12
    {F12}
    F13
    {F13}
    F14
    {F14}
    F15
    {F15}
    F16
    {F16}
    `````````````
    I got this information from **Microsoft**
    
    
    0 讨论(0)
提交回复
热议问题