同 FindStr,但返回区域内所有命中,格式 x1,y1|x2,y2|...;未找到返回空串。
| 参数名 | 方向 | 类型 | 说明 |
|---|---|---|---|
x1 | [in] | LONG | 查找区域左上角 x(客户区坐标) |
y1 | [in] | LONG | 查找区域左上角 y(客户区坐标) |
x2 | [in] | LONG | 查找区域右下角 x(不含该点) |
y2 | [in] | LONG | 查找区域右下角 y(不含该点) |
words | [in] | BSTR | 要找的字符串,如 L"血" |
color | [in] | BSTR | 文字颜色串(BGR 十六进制,可用 | 分隔多组),如 L"FF0000" |
sim | [in] | DOUBLE | 相似度 0.1~1.0(1.0 精确匹配),如 0.9 |
// ============ VC++ 控制台调用示例:FindStrEx ============
// 【怎么用】整段复制本代码,覆盖新建控制台工程的 main.cpp,直接生成并运行。
// 1. VS2019 新建「控制台应用」,解决方案平台务必选 x64(插件是 64 位 DLL)。
// 2. 项目属性 -> C/C++ -> 预编译头 -> 设为「不使用预编译头」,
// 否则新建工程默认带 pch.h,覆盖 main.cpp 后会报 C1010。
// 3. 把 x64Game-Plug.dll 放到工程目录(#import 编译期要读它的类型库),
// 再复制一份到生成的 exe 所在目录(运行期 LoadLibrary 要加载它)。
// 4. 源码保存为 UTF-8 带 BOM(或 ANSI/GBK),中文字符串才不会乱码。
// 全程不用 regsvr32 注册插件,也不用管理员权限。
//
#include <iostream>
#include <clocale>
#include <windows.h>
#include <comdef.h> // _bstr_t / _com_error
// ---------- 引用插件类型库:编译期生成 IGamePlugPtr 智能指针包装 ----------
#import "x64Game-Plug.dll" no_namespace rename("FindWindow", "FindWindowGP")
static HMODULE g_hDll = NULL;
static IGamePlugPtr g_plug;
// ---------- 免注册加载插件(不用 regsvr32) ----------
static bool LoadPlug()
{
const wchar_t* paths[] = {
L"x64Game-Plug.dll",
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* FnCreate)(void**);
FnCreate fn = (FnCreate)::GetProcAddress(g_hDll, "GamePlugCreate");
if (!fn)
{
std::cout << "GetProcAddress(GamePlugCreate) failed" << std::endl;
return false;
}
void* p = NULL;
if (FAILED(fn(&p)) || !p)
{
std::cout << "GamePlugCreate failed" << std::endl;
return false;
}
g_plug = IGamePlugPtr((IGamePlug*)p, false); // 对象已带引用,false = 不额外 AddRef
return true;
}
int main()
{
setlocale(LC_ALL, ""); // 控制台按系统代码页显示中文
if (!LoadPlug()) { std::cin.get(); return 1; }
// 本方法为收费命令,需先设置授权码(换成你自己的码)
g_plug->SetUsername(_bstr_t(L"U12-XXXXXXXXXXXX"));
// 注意:本方法为收费命令,需先 SetUsername 授权(见上方已激活的授权码行)。
// ---------- 调用插件本命令方法如下 ----------
// 【1】准备输入参数(按实际情况修改)
// x1 [in] LONG : 查找区域左上角 x(客户区坐标)
LONG x1 = 0;
// y1 [in] LONG : 查找区域左上角 y(客户区坐标)
LONG y1 = 0;
// x2 [in] LONG : 查找区域右下角 x(不含该点)
LONG x2 = 800;
// y2 [in] LONG : 查找区域右下角 y(不含该点)
LONG y2 = 600;
// words [in] BSTR : 要找的字符串,如 L"血"
_bstr_t words = L"血";
// color [in] BSTR : 文字颜色串(BGR 十六进制,可用 | 分隔多组),如 L"FF0000"
_bstr_t color = L"FF0000";
// sim [in] DOUBLE : 相似度 0.1~1.0(1.0 精确匹配),如 0.9
DOUBLE sim = 0.9;
// 【2】调用插件方法
// 返回值 ret BSTR : 所有命中坐标,格式 x1,y1|x2,y2|...;未找到返回空串。
try
{
BSTR ret = g_plug->FindStrEx(x1, y1, x2, y2, words, color, sim);
std::wcout << L"ret = " << _bstr_t(ret) << std::endl;
}
catch (const _com_error& e)
{
std::cout << "调用失败 HRESULT = 0x" << std::hex
<< (unsigned long)e.Error() << std::dec << std::endl;
}
// ---------- 程序退出前释放 ----------
g_plug.Release();
if (g_hDll) ::FreeLibrary(g_hDll);
std::cout << "Press Enter to exit...";
std::cin.get();
return 0;
}类型 BSTR(ret)。所有命中坐标,格式 x1,y1|x2,y2|...;未找到返回空串。