插件开发手册

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

后台设置抓图模式 - SetDisplayInput

接口 ID 160 | 分类:窗口绑定与显示模式 | 收费功能

作用说明

单独设置图色抓图模式(不重新绑定窗口),成功返回 1。dx2/dx3 不需要管理员权限。UnBindWindow 会自动把抓图模式恢复为 screen(前台屏幕)。

参数说明
参数名方向类型说明
mode[in]string抓图模式,可填:screen 或 normal(前台屏幕抓图,默认,窗口不能被遮挡)、gdi(后台 PrintWindow,窗口可被遮挡但不能最小化)、gdi2(后台先强制重绘整窗再抓,内容不自动刷新的窗口也能抓到最新画面)、dx2(32 位 2D 游戏专用:窗口最小化时瞬时移到屏幕外并全透明抓图,抓完放回最小化)、dx3(64 位 3D 游戏专用,与 dx2 各自独立的代码路径)、dx2.1(私服传奇专用)。
VC++ 控制台调用示例(可直接编译运行)
// 说明:本示例为完整 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 {
        _bstr_t mode = L"gdi";  // 后台 PrintWindow 抓图;可选 screen/gdi/gdi2/dx2/dx3/dx2.1
        VARIANT_BOOL ok = g_plug->SetDisplayInput(mode);
        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 取具体原因:-3 模式名无效(填了不认识的词);-4 抓图模式与目标进程位数不匹配(dx2 只能用于 32 位、dx3 只能用于 64 位,且需先用 BindWindow 绑定窗口)。

常见注意事项

1)必须先 BindWindow 绑定窗口,位数校验依赖已绑定的窗口。2)dx2/dx3 不需要管理员权限。3)UnBindWindow 后会自动回到 screen 模式。4)本功能为收费功能,调用前需 SetUsername 传入授权码(示例已含)。