插件开发手册

插件产品介绍
Game-Plug 是一款功能强大的 Windows 逆向开发插件,兼容 VC++、Delphi、VB、按键精灵、火山 PC、等多种编程语言调用。它面向编程人员提供窗口、内存、线程、汇编、HOOK、注入、Call、按键、封包、驱动防检测等全方位操作命令,并配有对应的使用案例示范,简单易学、上手快、实用性强。
目录导航

画面区域取字入库 - AddDictRegion

接口 ID 218 | 分类:文字识别与字库 | 定义文件:x64GamePlug.idl

作用说明

取字入库:把当前画面 (x1,y1)-(x2,y2) 区域里 color 颜色的那个字取成点阵,存进字库 index,words 指定这个字是什么(如「血」)。fixedRows 传 0 表示按暗点自动紧框;同一行文字建议统一字高(如 13),否则字库内字高不齐会影响找字精度。成功返回 1。

参数说明
参数名方向类型说明
index[in]LONG字库下标 0-19,如 0
x1[in]LONG取字区域左上角 x(客户区坐标)
y1[in]LONG取字区域左上角 y(客户区坐标)
x2[in]LONG取字区域右下角 x(不含该点)
y2[in]LONG取字区域右下角 y(不含该点)
color[in]BSTR目标文字颜色串(BGR 十六进制),如 L"FF0000"
words[in]BSTR这个字是什么,如 L"血"
fixedRows[in]LONG固定行高(像素),传 0 按暗点自动紧框
VC++ 控制台调用示例(可直接编译运行)
// ============ VC++ 控制台调用示例:AddDictRegion ============

// 【怎么用】整段复制本代码,覆盖新建控制台工程的 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"));



    // ---------- 调用插件本命令方法如下 ----------

    // 【1】准备输入参数(按实际情况修改)

    // index  [in] LONG : 字库下标 0-19,如 0

    LONG index = 0;

    // x1  [in] LONG : 取字区域左上角 x(客户区坐标)

    LONG x1 = 0;

    // y1  [in] LONG : 取字区域左上角 y(客户区坐标)

    LONG y1 = 0;

    // x2  [in] LONG : 取字区域右下角 x(不含该点)

    LONG x2 = 200;

    // y2  [in] LONG : 取字区域右下角 y(不含该点)

    LONG y2 = 40;

    // color  [in] BSTR : 目标文字颜色串(BGR 十六进制),如 L"FF0000"

    _bstr_t color = L"FF0000";

    // words  [in] BSTR : 这个字是什么,如 L"血"

    _bstr_t words = L"血";

    // fixedRows  [in] LONG : 固定行高(像素),传 0 按暗点自动紧框

    LONG fixedRows = 0;



    // 【2】调用插件方法

    // 返回值 ok LONG : 1=取字成功,0=失败(颜色未匹配到暗点)。

    try

    {

        LONG ok = g_plug->AddDictRegion(index, x1, y1, x2, y2, color, words, fixedRows);

        std::cout << "ok = " << ok << 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;

}
返回值

类型 LONG(ok)。1=取字成功,0=失败(颜色未匹配到暗点)。