有點標題黨的感覺~~這東西充其量只能說是按鍵輔助工具,和大名鼎鼎的按鍵精靈比起來實在是小巫見大巫了。
前兩天放假無聊,天氣太冷不想出門,玩起了很多年前玩過的一款游戲:騎士。太久沒玩,手指靈活度不夠,玩的是一塌糊塗。於是想起了大名鼎鼎的按鍵精靈,下載,寫腳本,再上游戲,解放了雙手的感覺就是不一樣,輕松+愜意。今天是新年上班第一天,比較有空,想起來這件事,秉承重復造輪子的指導方針,經過一下午的google,大概功能已經寫好,能夠滿足騎士中戰士這個職業最基本的需求。以下是代碼:
public class hook
{
// Fields
private static int hHook;
private HookProc KeyBoardHookProcedure;
static Dictionary<string, Thread> dict = new Dictionary<string, Thread>();
// Methods
static hook() { }
public hook() { }
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Auto)]
public static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam);
[DllImport("USER32.DLL")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("kernel32.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Auto)]
private static extern IntPtr GetModuleHandle(string lpModuleName);
public void Hook_Clear()
{
bool flag = true;
if (hHook != 0)
{
flag = UnhookWindowsHookEx(hHook);
hHook = 0;
}
if (!flag)
{
throw new Exception("取消hook失敗!");
}
}
public void Hook_Start()
{
if (hHook == 0)
{
this.KeyBoardHookProcedure = new HookProc(hook.KeyBoardHookProc);
hHook = SetWindowsHookEx(13, this.KeyBoardHookProcedure, GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0);
if (hHook == 0)
{
MessageBox.Show("設置Hook失敗!");
this.Hook_Clear();
}
}
}
[DllImport("User32.dll")]
public static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);
public static void 戰士抖殺()
{
while (true)
{
byte num1 = (byte)Keys.E;
keybd_event(num1, 0, 0, 0);
Thread.Sleep(100);
keybd_event(num1, 0, 2, 0);
Thread.Sleep(100);
keybd_event(num1, 0, 0, 0);
Thread.Sleep(100);
keybd_event(num1, 0, 2, 0);
Thread.Sleep(100);
byte num2 = (byte)Keys.D4;
keybd_event(num2, 0, 0, 0);
Thread.Sleep(100);
keybd_event(num2, 0, 2, 0);
Thread.Sleep(100);
keybd_event(num1, 0, 0, 0);
Thread.Sleep(100);
keybd_event(num1, 0, 2, 0);
Thread.Sleep(100);
keybd_event(num1, 0, 0, 0);
Thread.Sleep(100);
keybd_event(num1, 0, 2, 0);
Thread.Sleep(100);
byte num4 = (byte)Keys.R;
keybd_event(num4, 0, 0, 0);
Thread.Sleep(100);
keybd_event(num4, 0, 2, 0);
Thread.Sleep(100);
}
}
public static int KeyBoardHookProc(int nCode, IntPtr wParam, IntPtr lParam)
{
KeyBoardHookStruct input = (KeyBoardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyBoardHookStruct));
if (input.vkCode == (int)Keys.F11)
{
IntPtr ptr = GetForegroundWindow();
if (ptr != IntPtr.Zero)
{
if (dict.Count < 1)
{
ThreadStart threadStart = new ThreadStart(戰士抖殺);
Thread thread = new Thread(threadStart);
thread.Start();
dict.Clear();
dict.Add("戰士抖殺", thread);
}
}
return 1;
}
else if (input.vkCode == (int)Keys.F12)
{
foreach (var th in dict)
{
Thread thread = th.Value;
if (thread != null && thread.IsAlive)
{
if (!thread.Join(3))
{
thread.Abort();
}
}
}
dict.Clear();
}
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
[DllImport("USER32.DLL")]
public static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("user32.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Auto)]
public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
[DllImport("user32.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Auto)]
public static extern bool UnhookWindowsHookEx(int idHook);
// Nested Types
public delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam);
[StructLayout(LayoutKind.Sequential)]
public class KeyBoardHookStruct
{
public int vkCode;
public int scanCode;
public int flags;
public int time;
public int dwExtraInfo;
public KeyBoardHookStruct() { }
}
}
