# 游戏辅助工具
+ 第一代：基于模拟按键/鼠标、OCR、Opencv图像处理实现游戏辅助工具

## 一、模拟鼠标操作

### SendMessage/PostMessage
+ 移动鼠标：
    + SendMessage(hwnd, WM_MOUSEMOVE, MK_LBUTTON, MAKELPARAM(x, y));
+ 单击鼠标：
    + SendMessage(hwnd, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(x, y))
    + SendMessage(hwnd, WM_LBUTTONUP, MK_LBUTTON, MAKELPARAM(x, y));
    + 注意：鼠标单击事件时，游戏窗口必须顶层，使用SetForegroundWindow(hwnd)切换窗口到顶层;
+ 拖动鼠标：
    + 目前遇到技术难点，实现方式不生效：
    + SendMessage(hwnd, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(x, y));
    + SendMessage(hwnd, WM_MOUSEMOVE, 0, MAKELPARAM(x, y));
    + SendMessage(hwnd, WM_LBUTTONUP, 0, MAKELPARAM(x, y));
+ 右键鼠标：
    + SendMessage(hwnd, WM_RBUTTONDOWN, MK_LBUTTON, MAKELPARAM(x, y))
    + SendMessage(hwnd, WM_RBUTTONUP, MK_LBUTTON, MAKELPARAM(x, y));
    + 注意：鼠标单击事件时，游戏窗口必须顶层，使用SetForegroundWindow(hwnd)切换窗口到顶层;

### mouse_event、key_event
+ 移动鼠标：
    + mouse_event(MOUSEEVENTF_MOVE|MOUSEEVENTF_ABSOLUTE, x, y, 0, 0);
    + 需要注意的是MOUSEEVENTF_ABSOLUTE宏是绝对坐标,如果没这个宏使用的是相对坐标,换算更麻烦,建议使用绝对坐标;
单击鼠标：
    + // 屏幕坐标,窗口坐标需要转成屏幕坐标;
    + POINT ptScreen = ptWnd; 
    + ClientToScreen(&ptScreen);
    + // 窗口必须显示且位于顶层;
    + ::ShowWindow(hWnd);
    + ::SetForegroundWindow(hWnd);
    + // 在单击前,必须将鼠标位置设置在目标点上,否则无效;
    + ::SetCursorPos(ptScreen.x, ptScreen.y); 
    + mouse_event(MOUSEEVENTF_LEFTDOWN, ptScreen.x, ptScreen.y, 0, 0);
	+ mouse_event(MOUSEEVENTF_LEFTUP, ptScreen.x, ptScreen.y, 0, 0);
+ 拖动鼠标：
    + // 屏幕坐标,窗口坐标需要转成屏幕坐标;
    + POINT ptSStart = ptWndStart; 
    + POINT ptSEnd = ptWndEnd; 
    + ClientToScreen(&ptScreen);
    + ClientToScreen(&ptSEnd);
    + // 窗口必须显示且位于顶层;
    + ::ShowWindow(hWnd);
    + ::SetForegroundWindow(hWnd);
    + // 在单击前,必须将鼠标位置设置在目标点上,否则无效;
    + ::SetCursorPos(ptScreen.x, ptScreen.y); 
    + mouse_event(MOUSEEVENTF_LEFTDOWN, ptScreen.x, ptScreen.y, 0, 0);
    + mouse_event(MOUSEEVENTF_MOVE|MOUSEEVENTF_ABSOLUTE, ptSEnd.x, ptSEnd.y, 0, 0);
	+ mouse_event(MOUSEEVENTF_LEFTUP, ptSEnd.x, ptSEnd.y, 0, 0);
+ 右键鼠标：
    + // 屏幕坐标,窗口坐标需要转成屏幕坐标;
    + POINT ptScreen = ptWnd; 
    + ClientToScreen(&ptScreen);
    + // 窗口必须显示且位于顶层;
    + ::ShowWindow(hWnd);
    + ::SetForegroundWindow(hWnd);
    + // 在单击前,必须将鼠标位置设置在目标点上,否则无效;
    + ::SetCursorPos(ptScreen.x, ptScreen.y); 
    + mouse_event(MOUSEEVENTF_REFTDOWN, ptScreen.x, ptScreen.y, 0, 0);
	+ mouse_event(MOUSEEVENTF_REFTUP, ptScreen.x, ptScreen.y, 0, 0);

## 二、游戏截图与图像处理
### 1、GDI截图

### 2、DDRAW截图


### 3、DXGI截图


### 4、OCR-在线百度ORC


### 5、图像处理-Opencv


## 三、指令
+ 

### 类型：鼠标指令
+ 单击、右击、双击、移动、拖动；参数=目标点

### 类型：剪切板指令
+ 设置字符串；参数=字符串

### 类型：键盘指令
+ 按键：Ctrl/Alt/Shift + key
+ 粘贴；

### 类型：图像处理指令
+ 模板匹配
+ 

### 类型：百度OCR
+ 文字识别