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
コメント
コメントを投稿