把一个窗口绑定到插件。绑定之后,所有图色查找(找色/找图/取色)、键盘鼠标操作都只针对这个窗口进行,窗口被别的窗口遮挡、甚至最小化到任务栏都能正常生效(取决于所选的抓图/输入模式)。hwnd 传 0 表示解除当前绑定。成功返回 1,失败返回 0,可用 GetLastError 取具体失败原因。
| 参数名 | 方向 | 类型 | 说明 |
|---|---|---|---|
hwnd | [in] | hyper(64 位整数) | 要绑定的窗口句柄。必须是有效的窗口;传 0 表示解除绑定。 |
displayMode | [in] | string(可选) | 抓图模式,可填:screen 或 normal(前台屏幕,默认)、gdi(后台,窗口可遮挡)、gdi2(后台强制重绘再抓)、dx2(32 位 2D 游戏,最小化也能抓)、dx3(64 位 3D 游戏,最小化也能抓)、dx2.1(私服传奇特化)。留空表示不改动当前抓图模式。 |
mouseMode | [in] | string(可选) | 鼠标输入模式:normal(前台真实输入,窗口须可见且在前台)、windows(后台消息,默认)、windows2(增强后台消息)、windows3(同步后台消息,目标处理完才返回)、3d(3D 网游后台)、2d(2D 网游后台)、2d.1(2D 私服特化)。 |
keypadMode | [in] | string(可选) | 键盘输入模式,取值同 mouseMode。只填鼠标或键盘其中一项时,另一项自动跟随(键鼠共用同一套输入方式)。 |
// 说明:本示例为完整 x64 控制台工程,整段复制覆盖新建控制台工程的 main.cpp 即可编译运行。
// 1. VS2019 新建「控制台应用」,项目属性 -> 平台选 x64,才能加载 64 位 DLL。
// 2. 项目属性 -> C/C++ -> 预编译头 -> 改为「不使用预编译头」,否则默认找 pch.h 会报 C1010。
// 3. 把 x64Game-Plug.dll 放到 exe 同目录(#import 与免注册加载都需要)。
// 4. 源码保存为 UTF-8 带 BOM,避免中文乱码。
#include <iostream>
#include <clocale>
#include <windows.h>
#include <comdef.h>
// 免注册加载:用 IGamePlug 智能指针装载
// rename 是为避开 windows.h 的 FindWindow 宏冲突,接口里的 FindWindow 在 C++ 侧改名为 FindWindowGP
#import "x64Game-Plug.dll" no_namespace rename("FindWindow", "FindWindowGP")
static HMODULE g_hDll = NULL;
static IGamePlugPtr g_plug;
static bool LoadPlug() {
const wchar_t* paths[] = {
L"x64Game-Plug.dll",
L"..\\x64Game-Plug.dll"
};
for (int i = 0; i < (int)(sizeof(paths) / sizeof(paths[0])); ++i) {
g_hDll = ::LoadLibraryW(paths[i]);
if (g_hDll) break;
}
if (!g_hDll) {
std::cout << "LoadLibrary failed: put x64Game-Plug.dll next to the exe" << std::endl;
return false;
}
typedef HRESULT (__stdcall *GamePlugCreateFn)(IGamePlug**);
GamePlugCreateFn fn = (GamePlugCreateFn)::GetProcAddress(g_hDll, "GamePlugCreate");
if (!fn) { std::cout << "GetProcAddress GamePlugCreate failed" << std::endl; return false; }
HRESULT hr = fn(&g_plug);
if (FAILED(hr)) { std::cout << "GamePlugCreate failed: 0x" << std::hex << hr << std::endl; return false; }
return true;
}
int main() {
if (!LoadPlug()) { system("pause"); return 1; }
// 授权(收费功能需先传入授权码,去 https://www.game-plug.cn/ 获取)
g_plug->SetUsername(_bstr_t(L"U12-XXXXXXXXXXXXXXXX"));
// ---------- 调用插件本命令方法如下 ----------
try {
// hwnd:要绑定的窗口句柄(64 位整数)。这里用记事本窗口演示,实际请换成你的目标窗口句柄
hyper hwnd = g_plug->FindWindowGP(_bstr_t(L""), _bstr_t(L"记事本"));
if (hwnd == 0) { std::cout << "未找到窗口" << std::endl; }
else {
// displayMode=后台 gdi 抓图;mouseMode/keypadMode=后台 windows 消息(不传也行,默认就是 windows)
VARIANT_BOOL ok = g_plug->BindWindow(hwnd,
_variant_t(L"gdi"),
_variant_t(L"windows"),
_variant_t(L"windows"));
std::cout << "绑定结果(1=成功): " << (ok ? 1 : 0) << std::endl;
if (!ok) {
LONG err = g_plug->GetLastError();
std::cout << "失败原因 GetLastError=" << err << std::endl;
}
}
} catch (_com_error& e) {
std::wcout << L"COM error: " << e.ErrorMessage() << std::endl;
}
g_plug->Release();
system("pause");
return 0;
}
类型 VARIANT_BOOL(1/0)。1 = 绑定成功,指定的模式均已生效;0 = 绑定失败。失败时调用 GetLastError 取具体原因:-2 窗口句柄无效;-3 模式名无效(displayMode / mouseMode / keypadMode 填了不认识的词);-4 抓图模式与目标进程位数不匹配(dx2 只能绑 32 位、dx3 只能绑 64 位);-8 请求的 3d/2d 注入类模式没能注入(目标进程可能有保护或权限不足),插件已自动退回 windows 后台消息模式完成绑定,键鼠仍可按后台消息方式使用。
1)绑定后图色/键鼠命令不用再传 hwnd,直接针对该窗口;不绑定则默认对桌面(屏幕坐标)操作。2)多实例互不影响,每个插件对象各自绑定自己的窗口。3)dx2 只服务 32 位 2D 游戏、dx3 只服务 64 位 3D 游戏,位数填错直接绑定失败(-4),不会静默走错分支。4)绑定失败先调用 GetLastError 看错误码再排查,不要反复重试。5)本功能为收费功能,调用前需 SetUsername 传入授权码(示例已含)。