網路上遊戲外掛教程多針對大型線上遊戲,涉及封包分析、反組譯、C++ 等進階技術。主流外掛確實多以 VC++ 開發,但作為 .NET 技術愛好者,我們同樣能用 C# 實作核心功能——模擬鍵盤/滑鼠操作與修改記憶體資料。許多熱門遊戲的外掛(如勁舞團、QQ音速、連連看、網頁遊戲、大型網遊自動掛機)僅需模擬輸入裝置即可達成。

實作兩大核心功能:
外掛程式與遊戲屬於不同進程。透過 Windows API:
CallNextHookEx 傳遞給下一個鉤子// 鍵盤 Hook 結構
[StructLayout(LayoutKind.Sequential)]
public class KeyBoardHookStruct
{
public int vkCode;
public int scanCode;
public int flags;
public int time;
public int dwExtraInfo;
}
#region DllImport
// 安裝鉤子
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
// 移除鉤子
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern bool UnhookWindowsHookEx(int idHook);
// 呼叫下一個鉤子
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam);
// 取得模組句柄
[DllImport("kernel32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
private static extern IntPtr GetModuleHandle(string lpModuleName);
// 尋找目標視窗
[DllImport("USER32.DLL")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
// 置頂視窗
[DllImport("USER32.DLL")]
public static extern bool SetForegroundWindow(IntPtr hWnd);
// 模擬鍵盤事件
[DllImport("User32.dll")]
public static extern void keybd_event(Byte bVk, Byte bScan, Int32 dwFlags, Int32 dwExtraInfo);
// 釋放按鍵常數
private const int KEYEVENTF_KEYUP = 2;
#endregion
// 委派:C# 實現函式指標
public delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam);
public void Hook_Start()
{
if (hHook == 0)
{
KeyBoardHookProcedure = new HookProc(KeyBoardHookProc);
hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyBoardHookProcedure,
GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0);
}
}
關鍵點:C# 無法直接使用函式指標,透過 delegate(委派) 實現回呼功能。KeyBoardHookProcedure 指向實際處理函式 KeyBoardHookProc。
public static int KeyBoardHookProc(int nCode, IntPtr wParam, IntPtr lParam)
{
// 解析鍵盤輸入結構
KeyBoardHookStruct input = (KeyBoardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyBoardHookStruct));
// 範例:攔截 Home 鍵
if (input.vkCode == (int)Keys.Home)
{
// 此處撰寫自訂邏輯
}
// 傳遞給下一個鉤子
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
Warcraft III 內建熱鍵:Alt(全單位)、[(友方)、](敵方)。避免 Alt 干擾組合鍵,採用模擬長按 [ 與 ]:
IntPtr wcHandle = FindWindow(null, "Warcraft III");
if (wcHandle != IntPtr.Zero)
{
SetForegroundWindow(wcHandle);
byte VK_NUM1 = 219; // [ 鍵碼 - 顯示友方血量
byte VK_NUM2 = 221; // ] 鍵碼 - 顯示敵方血量
keybd_event(VK_NUM1, 0, 0, 0); // 長按 [
keybd_event(VK_NUM2, 0, 0, 0); // 長按 ]
}
if (input.vkCode == (int)Keys.Q)
{
IntPtr wcHandle = FindWindow(null, "Warcraft III");
if (wcHandle != IntPtr.Zero)
{
SetForegroundWindow(wcHandle);
byte VK_Q = (byte)Keys.NumPad7;
keybd_event(VK_Q, 0, 0, 0); // 按下小鍵盤 7
keybd_event(VK_Q, 0, KEYEVENTF_KEYUP, 0); // 釋放小鍵盤 7
}
return 1; // 阻止原始 Q 鍵傳遞
}
mouse_event API,讀者可自行探索參考書籍:《精通 .NET 互操作》——黃際洲、崔曉源著
原文連結:https://www.elivn.com