天天看點

被刷百萬點贊背後的故事,是顔值的支撐還是技術的提升?

這是案發在今天的故事,一位美麗動人聲音優雅的教師主播,引起我們強烈的興趣,于是乎.....

至少我們是這樣 [此處手動狗頭]。

被刷百萬點贊背後的故事,是顔值的支撐還是技術的提升?
毫無疑問這不可能純手破百萬的,這僅僅三十多人而已。無非就是些滑鼠連點器在不停的模拟點選,本文就介紹下滑鼠連點器的實作原理。

一、mouse_event

實作連點器的關鍵,就是mouse_event函數,但是這個函數和其他函數有一個不同點,那就是命名格式,一般Win API很少出現這種風格,不知道是什麼原因,就像Java中的Hashtable,但是不影響我們使用。

mouse_event在MSDN中說明已被SendInput取代,但是SendInput不太了解,還是介紹mouse_event吧。

被刷百萬點贊背後的故事,是顔值的支撐還是技術的提升?

dwFlags:這個參數也就是指明那個鍵被按下,取值如下。

MOUSEEVENTF_ABSOLUTE dX和dY參數含有規範化的絕對坐标
MOUSEEVENTF_LEFTDOWN 左按鈕按下
MOUSEEVENTF_LEFTUP 左按鈕擡起
MOUSEEVENTF_MIDDLEDOWN 中間按鈕按下
MOUSEEVENTF_MIDDLEUP 中間按鈕擡起
MOUSEEVENTF_MOVE 移動
MOUSEEVENTF_RIGHTDOWN 右按鈕按下
MOUSEEVENTF_RIGHTUP 右按鈕擡起
MOUSEEVENTF_WHEEL 滑輪

.... 

dx:指定滑鼠沿x軸的絕對位置或者從上次滑鼠事件産生以來移動的數量,依賴于MOUSEEVENTF_ABSOLUTE的設定。

dy:指定滑鼠沿y軸的絕對位置或者從上次滑鼠事件産生以來移動的數量,依賴于MOUSEEVENTF_ABSOLUTE的設定。

dwData:如果dwFlags為MOUSEEVENTF_WHEEL,則dwData指定滑鼠輪移動的數量。正值表明滑鼠輪向前轉動,負值表明滑鼠輪向後轉動,即朝向使用者。

dwExtralnfo:指定與滑鼠事件相關的附加32位值。

是以最終完成一次左鍵按下擡起操作,也就是一行。

mouse_event MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0.
           

光知道怎麼模拟其實還是不夠的啊,因為還需要有熱鍵開始暫停。

二、RegisterHotKey

見名知意,這是用來注冊熱鍵的,像我們QQ的截圖快捷鍵Ctrl+Alt+A或者是微信的截圖快捷鍵Ctlr+A。

被刷百萬點贊背後的故事,是顔值的支撐還是技術的提升?

hWnd:視窗的句柄。

id:熱鍵辨別符。

fsModifiers:取以下值,也就是可以指明熱鍵是否帶有Ctrl、Alt等鍵。

MOD_ALT Alt鍵
MOD_SHIFT Shift鍵鍵
MOD_WIN Windows鍵
MOD_NOREPEAT 更改熱鍵行為,以便鍵盤自動重複不會産生多個熱鍵通知
MOD_CONTROL Ctrl鍵

vk:指明虛拟鍵碼,比如熱鍵是A,則取65。

這個函數具體處理是在視窗函數中,熱鍵被觸發時,視窗函數會接收的WM_HOTKEY消息。wParam就是上面傳入的熱鍵辨別符,lParam的低位表示fsModifiers的值,高位表示vk的值。

像這些小程式開發,沒有比VB更合适的了,但是VB又封裝了視窗函數,是以我們又得需要GetWindowLong、SetWindowLong來修改預設的視窗函數。

WndFunchw = GetWindowLong(Me.hwnd, GWL_WNDPROC)
Call SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf Proc)
           

為了防止開始模拟點選後,滑鼠被誤移動,進而點到其他東西,是以還需要在開始後,不讓滑鼠移動到其他位置。最簡單可以使用GetCursorPos、SetCursorPos。

GetCursorPos在開始時擷取滑鼠位置并儲存下來,SetCursorPos是設定滑鼠位置。

三、完整代碼

Public Declare Function RegisterHotKey Lib "user32.dll" (ByVal hwnd As Long, ByVal id As Long, ByVal fsModifiers As Long, ByVal vk As Long) As Long
Public Declare Function UnregisterHotKey Lib "user32.dll" (ByVal hwnd As Long, ByVal id As Long) As Long
Public Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Public Type POINTAPI
X As Long
Y As Long
End Type
Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long

Public Declare Function SetCursorPos Lib "user32.dll" (ByVal X As Long, ByVal Y As Long) As Long

Public Declare Function GetWindowLong Lib "user32.dll" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Public Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Const GWL_WNDPROC As Long = -4

Public Const WM_HOTKEY As Long = &H312


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_MOVE = &H1
Public Const MOUSEEVENTF_LEFTDOWN = &H2
Public Const MOUSEEVENTF_LEFTUP = &H4
Public Const MOUSEEVENTF_RIGHTDOWN = &H8
Public Const MOUSEEVENTF_RIGHTUP = &H10
Public Const MOUSEEVENTF_MIDDLEDOWN = &H20
Public Const MOUSEEVENTF_MIDDLEUP = &H40
Public Const MOUSEEVENTF_ABSOLUTE = &H8000
Public Const HOTLEFT As Integer = 1
Public Const HOTUP As Integer = 2
Public Const HOTRIGHT As Integer = 3
Public Const HOTDOWN As Integer = 4
Public Const HOT_KEY_ID As Integer = 5
Public Const MOD_ALT As Long = &H1
Public Const MOD_CONTROL As Long = &H2

Public hWndFunc As Long
Public isPlay As Boolean
Public mCruuentPoint As POINTAPI

Public Function Proc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Select Case Msg
Case WM_HOTKEY
    If wParam = HOT_KEY_ID Then
        If isPlay = False Then
            Call GetCursorPos(mCruuentPoint)
        End If
        isPlay = Not isPlay
        Form1.Timer1.Enabled = isPlay
    End If

End Select

Proc = CallWindowProc(hWndFunc, hwnd, Msg, wParam, lParam)
End Function
           
Private Sub Form_Load()
Timer1.Enabled = False
Timer1.Interval = 1

hWndFunc = GetWindowLong(Me.hwnd, GWL_WNDPROC)
Call SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf Proc)
Dim r As Long
r = RegisterHotKey(Me.hwnd, HOT_KEY_ID, MOD_CONTROL, Asc("B"))
 If r = 0 Then
    MsgBox "熱鍵注冊失敗,請關閉使用方向鍵為ALT+S的程式"
   rk = False
 End If
Label2.Caption = "将滑鼠移動到點贊按鈕處,安Ctrl+B鍵 開始\暫停"

End Sub

Private Sub Label2_Click()
	Static count As Long
	count = count + 1
	Me.Caption = count
End Sub

Private Sub Timer1_Timer()
	SetCursorPos mCruuentPoint.X, mCruuentPoint.Y
	Label1.Caption = "開始瘋狂輸出"
	mouse_event MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
End Sub