學會用按鍵精靈教你畫射擊遊戲的準心?

有的時候,玩槍擊遊戲,不想一直使用腳本。想偶爾手動,但是又因為沒有準心時常打不準,鏘鏘鏘~那為什麼不自己畫一個準心呢?我們一起來學習下這個準心要如何畫吧~

工具/原料

按鍵精靈2014

方法/步驟

首先,我們先來簡單瞭解下,要用到的幾個Api函數,吼吼

SetROP2

聲明

Declare Function SetROP2 Lib "gdi32" Alias "SetROP2" (ByVal hdc As Long, ByVal nDrawMode As Long) As Long

功能

主要用於設定當前前景色的混合模式。R2_NOT就是取反的意思,即前景色為背景色的反色,經常用R2_NOT來畫橡皮線,因為兩次取反可以還原背景色。

參數

1.設備場景的句柄 2.設備場景的新繪圖模式

返回值

如執行成功,返回前一個繪圖模式;零表示出錯

GetWindowDC

聲明

Declare Function GetWindowDC Lib "user32" Alias "GetWindowDC" (ByVal hwnd As Long) As Long

功能

獲取整個窗口(包括邊框、滾動條、標題欄、菜單等)的設備場景

參數

窗口句柄

返回值

設備句柄

CreatePen

聲明

Declare Function CreatePen Lib "gdi32" Alias "CreatePen" (ByVal nPenStyle As Long, ByVal nWidth As Long, ByVal crColor As Long) As Long

功能

用指定的樣式、寬度和顏色創建一個畫筆

參數

畫筆類型

返回值

如函數執行成功,就返回指向新畫筆的一個句柄;否則返回零

SelectObject

聲明

Declare Function SelectObject Lib "gdi32" Alias "SelectObject" (ByVal hdc As Long, ByVal hObject As Long) As Long

功能

每個設備場景都可能有選入其中的圖形對象。其中包括位圖、刷子、字體、畫筆以及區域等等。一次選入設備場景的只能有一個對象。選定的對象會在設備場景的繪圖操作中使用。例如,當前選定的畫筆決定了在設備場景中描繪的線段顏色及樣式

參數

1.一個設備場景的句柄 2.一個畫筆、位圖、刷子、字體或區域的句柄

返回值

與以前選入設備場景的相同hObject類型的一個對象的句柄,零表示出錯。如選定的對象是一個區域(Region),結果就是下列常數之一:SIMPLEREGION, COMPLEXREGION 或 NULLREGION 對區域進行描述, GDI_ERROR 表示出錯

SelectObject

聲明

Declare Function SelectObject Lib "gdi32" Alias "SelectObject" (ByVal hdc As Long, ByVal hObject As Long) As Long

功能

每個設備場景都可能有選入其中的圖形對象。其中包括位圖、刷子、字體、畫筆以及區域等等。一次選入設備場景的只能有一個對象。選定的對象會在設備場景的繪圖操作中使用。例如,當前選定的畫筆決定了在設備場景中描繪的線段顏色及樣式

參數

1.一個設備場景的句柄 2.一個畫筆、位圖、刷子、字體或區域的句柄

返回值

與以前選入設備場景的相同hObject類型的一個對象的句柄,零表示出錯。如選定的對象是一個區域(Region),結果就是下列常數之一:SIMPLEREGION, COMPLEXREGION 或 NULLREGION 對區域進行描述, GDI_ERROR 表示出錯

MoveToEx

聲明

Declare Function MoveToEx Lib "gdi32" Alias "MoveToEx" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, lpPoint As POINTAPI) As Long

功能

為指定的設備場景指定一個新的當前畫筆位置。前一個位置保存在lpPoint中

參數

1.指向一個設備場景的句柄 2.採用邏輯座標表示的新畫筆位置 3.前一個畫筆位置

返回值

非零表示成功,零表示失敗

LineTo

聲明

Declare Function LineTo Lib "gdi32" Alias "LineTo" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long

功能

用當前畫筆畫一條線,從當前位置連到一個指定的點。這個函數調用完畢,當前位置變成x,y點

參數

1設備場景的句柄 2.線段終點位置,採用邏輯座標表示。這個點不會實際畫出來;它不屬於線段的一部分

返回值

非零表示成功,零表示失敗

DeleteObject

聲明

Declare Function DeleteObject Lib "gdi32" Alias "DeleteObject" (ByVal hObject As Long) As Long

功能

用這個函數刪除GDI對象,比如畫筆、刷子、字體、位圖、區域以及調色板等等。對象使用的所有系統資源都會被釋放

參數

一個GDI對象的句柄

返回值

非零表示成功,零表示失敗

我們拿桌面窗口做例子,在桌面窗口上畫一個準心,準心隨著鼠標移動而移動。

腳本大致過程:

1、 獲取當前鼠標座標,以鼠標座標作為畫筆位置

2、 取設備句柄,這裡設置取屏幕設備句柄

3、 創建一個畫筆對象

4、 將創建的畫筆對象載入到設備場景裡(當前屏幕即是設備場景)。

5、 清屏一次,消除之前畫筆對象畫的準心

6、 指定好畫筆開始的位置,(設置鼠標所在的座標)

7、 以鼠標座標為中心,畫一條橫線。以鼠標座標為中心,畫一條豎線

8、 加入Do……Loop 循環,畫一個準心刪除一個準心,這樣就實現了準心跟隨鼠標移動而移動

代碼:

Declare Function 取設備句柄 Lib "user32" Alias "GetWindowDC" (ByVal hwnd As Long) As Long

Declare Function 創建畫筆對象 Lib "gdi32" Alias "CreatePen" (ByVal nPenStyle As Long, ByVal nWidth As Long, ByVal crColor As Long) As Long

Declare Function 選入場景 Lib "gdi32.dll" Alias "SelectObject" (ByVal hwnd As Long,ByVal hwnd As Long) As Long

Declare Function 指定畫筆位置 Lib "gdi32" Alias "MoveToEx" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal x As Long) As Long

Declare Function 畫直線 Lib "gdi32" Alias "LineTo" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long

Declare Function 刪除對象 Lib "gdi32" Alias "DeleteObject" (ByVal hObject As Long) As Long

//取設備句柄(窗口句柄)[返回設備句柄,整數型]

//創建畫筆對象(類型,寬度,顏色)[返回對象句柄]

//選人場景(設備句柄,場景句柄)

//指定畫筆位置(設備句柄,X,Y,座標結購)

//畫直線(設備句柄,終點X,終點Y)

//刪除對象(對象句柄)

Do

GetCursorPos x, y

設備句柄 =取設備句柄(0)//窗口句柄為0時,取屏幕設備句柄,如在指定窗口畫就填寫窗口句柄

對象句柄 = 創建畫筆對象(1, 2, 255)//參數1為類型,參數2為線條粗細,參數3為10進制的顏色值(255是紅色)

TracePrint 設備句柄

TracePrint 對象句柄

TracePrint 選入場景(設備句柄, 對象句柄)//此操作相當於windows畫圖時鼠標選擇了畫筆按鈕。

Call Plugin.Msg.HideScrTXT()

TracePrint 指定畫筆位置(設備句柄,x-50,y,座標結構)//座標結構不要使用,按鍵不支持此數據類型

TracePrint 畫直線(設備句柄, x + 50, y )//畫橫線

TracePrint 指定畫筆位置(設備句柄,x,y-50,座標結構)//座標結構不要使用,按鍵不支持此數據類型

TracePrint 畫直線(設備句柄, x, y + 50)//畫豎線

loop

TracePrint 刪除對象(對象句柄)'畫完以後記得釋放對象

另一種方法,通過 SetROP2 函數實現。

前一種方法,是使用屏幕刷新 Call Plugin.Msg.HideScrTXT() 用屏幕刷新來實現,畫完一個準心刷新一次屏幕,把前面的畫的準心清除掉。 SetROP2 函數是使用反色來覆蓋掉前一次畫的準心。

腳本大致思路:

1、 畫準心前,先取屏幕背景色的反色作為畫筆的顏色,並且記錄好當前鼠標座標。

2、 畫一個準心。

3、 畫完之後,再次取反色,第一次獲取屏幕背景色的反色,然後第二次再取反色,那這次取到的就是屏幕的背景色了。然後利用原來記錄好的鼠標座標,畫一個準心,相當於把之前畫的準心用屏幕背景色再畫一次進行覆蓋。

4、 循環畫準心,達到鼠標移動,準心跟著移動的效果。

代碼:

Declare Function 反色 Lib "gdi32" Alias "SetROP2" (ByVal hdc As Long, ByVal nDrawMode As Long) As Long

Declare Function 取設備句柄 Lib "user32" Alias "GetWindowDC" (ByVal hwnd As Long) As Long

Declare Function 創建畫筆對象 Lib "gdi32" Alias "CreatePen" (ByVal nPenStyle As Long, ByVal nWidth As Long, ByVal crColor As Long) As Long

Declare Function 選入場景 Lib "gdi32.dll" Alias "SelectObject" (ByVal hwnd As Long,ByVal hwnd As Long) As Long

Declare Function 指定畫筆位置 Lib "gdi32" Alias "MoveToEx" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal x As Long) As Long

Declare Function 畫直線 Lib "gdi32" Alias "LineTo" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long

Declare Function 刪除對象 Lib "gdi32" Alias "DeleteObject" (ByVal hObject As Long) As Long

//反色 (設備句柄,繪圖模式)

//取設備句柄(窗口句柄)[返回設備句柄,整數型]

//創建畫筆對象(類型,寬度,顏色)[返回對象句柄]

//選人場景(設備句柄,場景句柄)

//指定畫筆位置(設備句柄,X,Y,座標結購)

//畫直線(設備句柄,終點X,終點Y)

//刪除對象(對象句柄)

// x1,y1 繪製座標 x2,y2 上次繪製座標

Dim x1, x2, y1, y2

設備句柄 =取設備句柄(0)//取桌面窗口設備句柄,如在指定窗口畫就填寫窗口句柄

對象句柄 = 創建畫筆對象(1, 2, 0)//參數1為類型,參數2為線條粗細,參數3為10進制的顏色值(這裡用到了反色api準心是背景反色就不設置顏色了)

TracePrint 設備句柄

TracePrint 對象句柄

TracePrint 選入場景(設備句柄, 對象句柄)//此操作相當於windows畫圖時鼠標選擇了畫筆按鈕。

Do

反色 設備句柄, 6 //R2_NOT 繪圖模式的值是6

TracePrint 指定畫筆位置(設備句柄, x2 - 50, y2, 座標結構)//座標結構不要使用,按鍵不支持此數據類型

TracePrint 畫直線(設備句柄, x2 + 50, y2 )//畫橫線

TracePrint 指定畫筆位置(設備句柄, x2, y2 - 50, 座標結構)//座標結構不要使用,按鍵不支持此數據類型

TracePrint 畫直線(設備句柄, x2, y2 + 50)//畫豎線

GetCursorPos x1, y1

反色 設備句柄,6

TracePrint 指定畫筆位置(設備句柄, x1 - 50, y1, 座標結構)//座標結構不要使用,按鍵不支持此數據類型

TracePrint 畫直線(設備句柄, x1 + 50, y1 )//畫橫線

TracePrint 指定畫筆位置(設備句柄, x1, y1 - 50, 座標結構)//座標結構不要使用,按鍵不支持此數據類型

TracePrint 畫直線(設備句柄, x1, y1 + 50)//畫豎線

x2 = x1

y2 = y1

loop

相關問題答案