吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2239|回复: 70
上一主题 下一主题
收起左侧

[原创工具] 剪贴板文本输入器,140k的小工具,可以把剪贴板的文本输入不能粘贴只可以手打的输入框

  [复制链接]
跳转到指定楼层
楼主
858983646 发表于 2025-3-25 20:16 回帖奖励
本帖最后由 858983646 于 2025-3-25 20:22 编辑

使用就是打开就行,设好参数点击开始,其中设置CTRL+V会导致原本粘贴无效




[C++] 纯文本查看 复制代码
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <string.h>
 
// 确保虚拟键码定义
#define VK_E 0x45
#define VK_Q 0x51
#define VK_V 0x56
 
// 定义资源标识符
#define IDC_BUTTON_START 101
#define IDC_BUTTON_STOP 102
#define IDC_EDIT_INTERVAL 103
#define IDC_COMBO_HOTKEY 104
 
// 定义定时器ID
#define TIMER_ID_RESET_INTERVAL 1
 
// 全局变量
HINSTANCE g_hInst = NULL;
HHOOK g_hHook = NULL;
BOOL g_bHookInstalled = FALSE;
HWND g_hMainWnd = NULL;
int g_nInputInterval = 20; // 默认输入间隔(毫秒)
BOOL g_bTerminateInput = FALSE; // 是否终止输入标志
int g_nSelectedHotkey = 0; // 0: Ctrl+E, 1: Ctrl+Q, 2: Ctrl+V, 3: Alt+V
HANDLE g_hInputThread = NULL; // 输入线程句柄
WCHAR* g_pszClipboardText = NULL; // 剪贴板文本
 
// 函数声明
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
void SetClipboardHook();
void RemoveClipboardHook();
void SimulateTextInput(const WCHAR* text);
void SimulateCharInput(WCHAR ch);
void CreateMainWindow();
void UpdateUIState();
DWORD WINAPI SimulateTextInputThread(LPVOID lpParam);
 
// DLL 入口点
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
    g_hInst = (HINSTANCE)hModule;
    return TRUE;
}
 
// 键盘钩子回调函数
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) {
    if (nCode >= 0) {
        KBDLLHOOKSTRUCT* pkbllhs = (KBDLLHOOKSTRUCT*)lParam;
 
        // 检测快捷键
        if (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) {
            BOOL bBlock = FALSE;
            BOOL bAltPressed = (GetAsyncKeyState(VK_MENU) & 0x8000) != 0;
            BOOL bCtrlPressed = (GetAsyncKeyState(VK_CONTROL) & 0x8000) != 0;
 
            switch (g_nSelectedHotkey) {
                case 0: // Ctrl+E
                    if (pkbllhs->vkCode == VK_E && bCtrlPressed && !bAltPressed) {
                        bBlock = TRUE;
                    }
                    break;
                case 1: // Ctrl+Q
                    if (pkbllhs->vkCode == VK_Q && bCtrlPressed && !bAltPressed) {
                        bBlock = TRUE;
                    }
                    break;
                case 2: // Ctrl+V
                    if (pkbllhs->vkCode == VK_V && bCtrlPressed && !bAltPressed) {
                        bBlock = TRUE;
                    }
                    break;
                case 3: // Alt+V
                    if (pkbllhs->vkCode == VK_V && bAltPressed && !bCtrlPressed) {
                        bBlock = TRUE;
                    }
                    break;
            }
 
            if (bBlock) {
                if (g_hInputThread != NULL) {
                    g_bTerminateInput = TRUE; // 设置终止输入标志
                } else {
                    if (OpenClipboard(NULL)) {
                        HANDLE hData = GetClipboardData(CF_UNICODETEXT);
                        if (hData != NULL) {
                            g_pszClipboardText = (WCHAR*)GlobalLock(hData);
                            if (g_pszClipboardText != NULL) {
                                g_hInputThread = CreateThread(NULL, 0, SimulateTextInputThread, (LPVOID)g_pszClipboardText, 0, NULL);
                            }
                            GlobalUnlock(hData);
                        }
                        CloseClipboard();
                    }
                }
                return 1; // 阻止默认操作
            }
        }
    }
    return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}
 
 
// 设置钩子
void SetClipboardHook() {
    if (!g_bHookInstalled) {
        g_hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, g_hInst, 0);
        if (g_hHook != NULL) {
            g_bHookInstalled = TRUE;
            UpdateUIState();
        }
    }
}
 
// 移除钩子
void RemoveClipboardHook() {
    if (g_bHookInstalled) {
        UnhookWindowsHookEx(g_hHook);
        g_hHook = NULL;
        g_bHookInstalled = FALSE;
        UpdateUIState();
    }
}
 
// 模拟输入宽字符文本
void SimulateTextInput(const WCHAR* text) {
    g_bTerminateInput = FALSE; // 重置终止标志
 
    for (const WCHAR* p = text; *p != L'\0' && !g_bTerminateInput; ++p) {
        SimulateCharInput(*p);
        Sleep(g_nInputInterval); // 使用自定义间隔
    }
 
    if (g_bTerminateInput) {
        g_bTerminateInput = FALSE; // 重置标志
    }
}
 
// 模拟宽字符输入
void SimulateCharInput(WCHAR ch) {
    INPUT input[2] = {0};
 
    input[0].type = INPUT_KEYBOARD;
    input[0].ki.wVk = 0;
    input[0].ki.wScan = ch;
    input[0].ki.dwFlags = KEYEVENTF_UNICODE;
 
    input[1].type = INPUT_KEYBOARD;
    input[1].ki.wVk = 0;
    input[1].ki.wScan = ch;
    input[1].ki.dwFlags = KEYEVENTF_UNICODE | KEYEVENTF_KEYUP;
 
    SendInput(2, input, sizeof(INPUT));
}
 
// 创建主窗口
void CreateMainWindow() {
    WNDCLASSEX wc = {0};
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WndProc;
    wc.hInstance = g_hInst;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.lpszClassName = "ClipboardHookWndClass";
 
    if (RegisterClassEx(&wc)) {
        g_hMainWnd = CreateWindowEx(
            0,
            "ClipboardHookWndClass",
            "剪贴板文本输入器1.0",
            WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT, CW_USEDEFAULT, 350, 250,
            NULL,
            NULL,
            g_hInst,
            NULL
        );
 
        if (g_hMainWnd) {
            ShowWindow(g_hMainWnd, SW_SHOW);
            UpdateUIState();
        }
    }
}
 
// 更新UI状态
void UpdateUIState() {
    if (g_hMainWnd) {
        EnableWindow(GetDlgItem(g_hMainWnd, IDC_BUTTON_START), !g_bHookInstalled);
        EnableWindow(GetDlgItem(g_hMainWnd, IDC_BUTTON_STOP), g_bHookInstalled);
    }
}
 
// 窗口过程函数
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
    static HWND hEditInterval = NULL;
    static HWND hComboHotkey = NULL;
 
    switch (message) {
        case WM_CREATE:
        {
            // 创建控件
            CreateWindow("BUTTON", "开启",
                WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
                20, 30, 80, 30, hWnd, (HMENU)IDC_BUTTON_START, g_hInst, NULL);
 
            CreateWindow("BUTTON", "关闭",
                WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
                120, 30, 80, 30, hWnd, (HMENU)IDC_BUTTON_STOP, g_hInst, NULL);
 
            hEditInterval = CreateWindow("EDIT", "50",
                WS_TABSTOP | WS_VISIBLE | WS_CHILD | ES_NUMBER,
                170, 80, 140, 30, hWnd, (HMENU)IDC_EDIT_INTERVAL, g_hInst, NULL);
 
            CreateWindow("STATIC", "输入间隔(毫秒):",
                WS_VISIBLE | WS_CHILD | SS_LEFT,
                20, 80, 130, 30, hWnd, NULL, g_hInst, NULL);
                
            CreateWindow("STATIC", "快捷键(再按终止)):",
                WS_VISIBLE | WS_CHILD | SS_LEFT,
                20, 120, 150, 100, hWnd, NULL, g_hInst, NULL);
 
            // 创建组合框
            hComboHotkey = CreateWindowW(L"COMBOBOX", NULL,
                WS_TABSTOP | WS_VISIBLE | WS_CHILD | CBS_DROPDOWNLIST,
                160, 120, 165, 100, hWnd, (HMENU)IDC_COMBO_HOTKEY, g_hInst, NULL);
 
            // 添加组合框项
            SendMessageW(hComboHotkey, CB_ADDSTRING, 0, (LPARAM)L"Ctrl+E");
            SendMessageW(hComboHotkey, CB_ADDSTRING, 0, (LPARAM)L"Ctrl+Q");
            SendMessageW(hComboHotkey, CB_ADDSTRING, 0, (LPARAM)L"Ctrl+V");
            SendMessageW(hComboHotkey, CB_ADDSTRING, 0, (LPARAM)L"Alt+V");
            SendMessageW(hComboHotkey, CB_SETCURSEL, 0, 0); // 默认选择第一个
 
            // 设置定时器,在100毫秒后触发
            SetTimer(hWnd, TIMER_ID_RESET_INTERVAL, 100, NULL);
 
            UpdateUIState();
            break;
        }
        case WM_CTLCOLORSTATIC:
        {
            HDC hdc = (HDC)wParam;
            HWND hwndStatic = (HWND)lParam;
 
            // 设置背景颜色为白色
            SetBkColor(hdc, RGB(255, 255, 255));
            // 返回白色画刷作为背景
            return (LRESULT)GetStockObject(WHITE_BRUSH);
        }
        case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            if (wmId == IDC_BUTTON_START) {
                SetClipboardHook();
            } else if (wmId == IDC_BUTTON_STOP) {
                RemoveClipboardHook();
            } else if (wmId == IDC_EDIT_INTERVAL) {
                if (HIWORD(wParam) == EN_CHANGE) {
                    TCHAR buffer[32];
                    GetWindowText(hEditInterval, buffer, 32);
                    g_nInputInterval = _ttoi(buffer);
                }
            } else if (wmId == IDC_COMBO_HOTKEY) {
                if (HIWORD(wParam) == CBN_SELCHANGE) {
                    int index = SendMessage(hComboHotkey, CB_GETCURSEL, 2, 0);
                    g_nSelectedHotkey = index;
                }
            }
            break;
        }
        case WM_TIMER:
        {
            if (wParam == TIMER_ID_RESET_INTERVAL) {
                // 停止定时器
                KillTimer(hWnd, TIMER_ID_RESET_INTERVAL);
 
                // 将输入间隔改回20
                g_nInputInterval = 20;
 
                // 更新编辑框的显示
                TCHAR buffer[32];
                _itot(g_nInputInterval, buffer, 10);
                SetWindowText(hEditInterval, buffer);
            }
            break;
        }
        case WM_CLOSE:
            RemoveClipboardHook();
            DestroyWindow(hWnd);
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
 
 
// 主函数
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    CreateMainWindow();
 
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return 0;
}
 
// 模拟输入线程函数
DWORD WINAPI SimulateTextInputThread(LPVOID lpParam) {
    SimulateTextInput((WCHAR*)lpParam);
    g_hInputThread = NULL;
    return 0;
}

剪贴板文本输入器.rar

105.47 KB, 下载次数: 130, 下载积分: 吾爱币 -2 CB

免费评分

参与人数 9吾爱币 +16 热心值 +6 收起 理由
dysky + 2 + 1 直接叫快贴1.0,剪贴板文本输入器不利于传播。
viconly + 1 + 1 谢谢@Thanks!
风之暇想 + 7 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
抱薪风雪雾 + 1 + 1 谢谢@Thanks!
tmdldc + 1 谢谢@Thanks!
yanglinman + 1 谢谢@Thanks!
zlyok006 + 1 谢谢@Thanks!
莫奇 + 1 + 1 谢谢@Thanks!
ZhangPuBi + 1 + 1 我很赞同!

查看全部评分

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

推荐
 楼主| 858983646 发表于 2025-3-26 09:41 |楼主
hummel 发表于 2025-3-26 08:57
强制复制,针对某些网站非注册会员会有用吧!

是粘贴,不是复制,工作时有的软件不让复制粘贴只可以打字
推荐
dazebat 发表于 2025-3-29 19:12
manglang 发表于 2025-3-25 21:39
谁给个具体的应用场景。

我在工作中,碰到的场景是:有些pdf表格,在上级分发给我之前就被保护锁定了,到咱手里的时候,复制粘贴用不了。数据量大的时候,很崩溃。所以这时候这种小工具就很有用。
沙发
yemind 发表于 2025-3-25 20:38
3#
zhangxiang998 发表于 2025-3-25 21:07
666666
4#
ZhangPuBi 发表于 2025-3-25 21:10
哇,厉害了。大佬厉害,感谢大佬分享,使用这个必然会省去很多麻烦。
5#
shiqiang 发表于 2025-3-25 21:19
感谢分享,收藏备用。
6#
manglang 发表于 2025-3-25 21:39
谁给个具体的应用场景。
7#
W799699 发表于 2025-3-25 22:01
这个就是粘贴不了白
8#
Wu19832707520 发表于 2025-3-25 22:01
manglang 发表于 2025-3-25 21:39
谁给个具体的应用场景。

学习通考试无法粘贴答案的时候,就可以用这样的软件
9#
mycc11 发表于 2025-3-25 22:04
感谢分享 厉害
10#
8970665 发表于 2025-3-25 22:23
试一下这个
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2025-4-1 02:01

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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