vb.net フォーム外のマウスカーソルの位置を取得して画面の指定位置をクリックする方法

visual studio 2022 vb.net
フォーム外のマウスカーソルの位置を取得して画面の指定位置をクリックする方法

有名動画サイトは課金すると広告の表示を無くすことができますが、赤字経営者には負担が大きいです。
実は広告のとある位置を次々にクリックしていくとスキップ出来ます。
数回クリックする必要があるのですが、この方法を使うとスキップ出来ない広告もスキップ出来ます。(ちょっと時間がかかりますが)
しかし、毎回クリックするのも面倒だし、クリック範囲も狭いので自動化しました。
vb.netではフォーム内のクリックは簡単にできるのですが、フォーム外をクリックするのはてこずります。

フォーム外のクリックイベントを自在に扱えるとクリックやテキスト入力ができるようになり、業務の自動化も可能です。
まあ、クリック位置やテキストボックスの位置などが変わらないことが条件ですが。

下記はクリックするサンプルだけです。
実際はCMによってクリックする位置が異なります。
私の場合は画面が変わるCMでボタンを4個、下部の帯CMで2つの計6個のボタンを配置してます。
また、再生速度の変更ボタンも配置して1クリックで変更できるようにしています。


手順
1.windows apiのuser32でマウスカーソルの位置を調べてラベルで表示しておきます。
  どこをクリックしたら良いのか調べるためです。
  クリックしたい位置をメモしておきます。
2.調べたマウスカーソル位置をクリックしていきます。
  その際、ウインドウが表示されるタイミングを見計らって次のクリックをするのがコツです。
サンプルプログラムでは直接クリックする位置を記載していますが、実際はクリック位置と待ち時間をテキストファイルで設定ファイルとして保存しておき、プログラム起動時に設定ファイルを読み込んでいます。


---------------サンプルプログラム---------------

フォームにLabei1とButton1を置いてください。



**************以下、コピベ用**************

Imports System.Runtime.InteropServices

Public Structure s_POINT
    Public x As Integer
    Public y As Integer
End Structure


Public Class Form1

    <DllImport("user32.dll", CharSet:=CharSet.Auto)>
    Private Shared Function GetCursorPos(ByRef lpPoint As s_POINT) As Boolean
    End Function

    'タイマー
    Public WithEvents p_Timer As New Timer

    '取得位置格納用
    Dim m_X As Double = 0
    Dim m_Y As Double = 0

    '時間用カウンタ
    Dim m_Counter As Integer

    '---標準モジュール---
    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


    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        p_Timer.Interval = 10
        m_Counter = 0
        p_Timer.Enabled = True

        'フォームをトップに表示
        Me.TopMost = True

        Console.WriteLine()

    End Sub

    'タイマーイベント
    Private Sub p_Timer_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles p_Timer.Tick

        Dim p As s_POINT
        m_Counter += 1
        Try
            GetCursorPos(p)
        Catch ex As Exception
            MsgBox("マウスカーソルの位置取得に失敗しました。" + vbCrLf + "処理を終了します。", MsgBoxStyle.OkOnly Or MsgBoxStyle.Exclamation, "警告")
            End
        End Try

        'ラベルにマウスカーソルの位置を表示
        If p.x <> m_X OrElse p.y <> m_Y Then
            Label1.Text = ("X=" + p.x.ToString + vbCrLf + "Y=" + p.y.ToString)
            m_X = p.x
            m_Y = p.y
        End If

    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        Dim mxp1, mxp2, mxp3 As Long
        Dim myp1, myp2, myp3 As Long
        Dim tm1, tm2, tm3 As Long

        '1回目のクリック位置と待ち時間
        mxp1 = 600
        myp1 = 600
        tm1 = 200

        '2回目のクリック位置と待ち時間
        mxp2 = 620
        myp2 = 620
        tm2 = 200

        '3回目のクリック位置と待ち時間
        mxp3 = 640
        myp3 = 640
        tm3 = 200

        '-----------1回目のクリック-------------
        'マウスカーソルの位置を変更
        System.Windows.Forms.Cursor.Position = New System.Drawing.Point(mxp1, myp1)
        'マウスカーソルの位置で左クリック
        mouse_event(MOUSEEVENTF_LEFTDOWN, mxp1, myp1, 0, 0)
        mouse_event(MOUSEEVENTF_LEFTUP, mxp1, myp1, 0, 0)
        '停止時間
        System.Threading.Thread.Sleep(tm1)

        '-----------2回目のクリック-------------
        'マウスカーソルの位置を変更
        System.Windows.Forms.Cursor.Position = New System.Drawing.Point(mxp2, myp2)
        'マウスカーソルの位置で左クリック
        mouse_event(MOUSEEVENTF_LEFTDOWN, mxp2, myp2, 0, 0)
        mouse_event(MOUSEEVENTF_LEFTUP, mxp2, myp2, 0, 0)
        '停止時間
        System.Threading.Thread.Sleep(tm2)

        '-----------3回目のクリック-------------
        'マウスカーソルの位置を変更
        System.Windows.Forms.Cursor.Position = New System.Drawing.Point(mxp3, myp3)
        'マウスカーソルの位置で左クリック
        mouse_event(MOUSEEVENTF_LEFTDOWN, mxp3, myp3, 0, 0)
        mouse_event(MOUSEEVENTF_LEFTUP, mxp3, myp3, 0, 0)
        '停止時間
        System.Threading.Thread.Sleep(tm3)

    End Sub




























コメント