吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3253|回复: 70
收起左侧

[原创工具] 04-08更新2.0 剪贴板文本输入器,可以输入不能粘贴的输入框

  [复制链接]
858983646 发表于 2025-3-25 20:16
本帖最后由 858983646 于 2025-4-8 21:32 编辑

使用就是打开就行,设好参数点击开始,其中设置CTRL+V会导致原本粘贴无效
04-08更新,可以记录剪贴板历史记录了,选中那一下就可以输入哪一项了
捕获.JPG


[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
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <tchar.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
#define IDC_LISTBOX_CLIPBOARD_RECORDS 105
#define IDC_BUTTON_DELETE 107
#define IDC_BUTTON_CLEAR 109 // 新增清空按钮ID
#define IDC_CHECKBOX_TOPMOST 108 // 复选框ID
 
// 定义定时器ID
#define TIMER_ID_RESET_INTERVAL 1
 
// 在头文件部分添加以下定义
#ifndef LB_END
#define LB_END (-1)
#endif
 
// 全局变量
WCHAR** g_ClipboardRecords = NULL;
int g_ClipboardRecordCount = 0;
HWND g_hListBox = NULL;
 
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, 4: 无快捷键
HANDLE g_hInputThread = NULL; // 输入线程句柄
WCHAR* g_pszClipboardText = NULL; // 剪贴板文本
BOOL g_bTopMost = FALSE; // 窗口是否置于顶层
 
// 函数声明
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",
            "剪贴板文本输入器2.0",
            WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT, CW_USEDEFAULT, 400, 500,
            NULL,
            NULL,
            g_hInst,
            NULL
        );
 
        if (g_hMainWnd) {
            ShowWindow(g_hMainWnd, SW_SHOW);
            UpdateUIState();
 
            // 注册剪贴板更新消息
            AddClipboardFormatListener(g_hMainWnd);
        }
    }
}
 
// 更新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 HBRUSH hBrush; // 背景色
    static HBRUSH hButtonBrush; // 按钮颜色
    static HBRUSH hButtonHoverBrush; // 按钮悬停颜色
    static HBRUSH hButtonPressedBrush; // 按钮按下颜色
    static HFONT hFont; // 字体
    static HWND hEditInterval = NULL;
    static HWND hComboHotkey = NULL;
    static HWND hCheckboxTopMost = NULL;
    static HWND hStartButton = NULL;
    static HWND hStopButton = NULL;
    static HWND hDeleteButton = NULL;
    static HWND hClearButton = NULL;
 
    switch (message) {
        case WM_CREATE:
        {
            // 创建资源
            hBrush = CreateSolidBrush(RGB(240, 240, 240));
            hButtonBrush = CreateSolidBrush(RGB(64, 128, 255));
            hButtonHoverBrush = CreateSolidBrush(RGB(50, 100, 200));
            hButtonPressedBrush = CreateSolidBrush(RGB(40, 80, 160));
            hFont = CreateFont(14, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, "Segoe UI");
 
            // 设置窗口背景颜色
            SetClassLong(hWnd, GCL_HBRBACKGROUND, (LONG)hBrush);
 
            // 创建控件
            hStartButton = CreateWindow("BUTTON", "开启",
                WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON | BS_FLAT,
                20, 30, 80, 30, hWnd, (HMENU)IDC_BUTTON_START, g_hInst, NULL);
 
            hStopButton = CreateWindow("BUTTON", "关闭",
                WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON | BS_FLAT,
                120, 30, 80, 30, hWnd, (HMENU)IDC_BUTTON_STOP, g_hInst, NULL);
 
            // 创建“窗口置顶”按钮
            hCheckboxTopMost = CreateWindow("BUTTON", "窗口置顶",
                WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_AUTOCHECKBOX,
                220, 30, 100, 30, hWnd, (HMENU)IDC_CHECKBOX_TOPMOST, g_hInst, NULL);
 
            hEditInterval = CreateWindow("EDIT", "50",
                WS_TABSTOP | WS_VISIBLE | WS_CHILD | ES_NUMBER | WS_EX_CLIENTEDGE,
                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 = CreateWindow("COMBOBOX", NULL,
                WS_TABSTOP | WS_VISIBLE | WS_CHILD | CBS_DROPDOWNLIST | WS_VSCROLL | WS_EX_CLIENTEDGE,
                160, 120, 165, 100, hWnd, (HMENU)IDC_COMBO_HOTKEY, g_hInst, NULL);
 
            // 添加组合框项
            SendMessage(hComboHotkey, CB_ADDSTRING, 0, (LPARAM)"Ctrl+E");
            SendMessage(hComboHotkey, CB_ADDSTRING, 0, (LPARAM)"Ctrl+Q");
            SendMessage(hComboHotkey, CB_ADDSTRING, 0, (LPARAM)"Ctrl+V");
            SendMessage(hComboHotkey, CB_ADDSTRING, 0, (LPARAM)"Alt+V");
            SendMessage(hComboHotkey, CB_ADDSTRING, 0, (LPARAM)"无快捷键");
            SendMessage(hComboHotkey, CB_SETCURSEL, 0, 0); // 默认选择第一个
 
            // 设置定时器,在10毫秒后触发
            SetTimer(hWnd, TIMER_ID_RESET_INTERVAL, 10, NULL);
 
            // 创建列表框
            g_hListBox = CreateWindow("LISTBOX", NULL,
                WS_TABSTOP | WS_VISIBLE | WS_CHILD | LBS_STANDARD,
                20, 160, 360, 280, hWnd, (HMENU)IDC_LISTBOX_CLIPBOARD_RECORDS, g_hInst, NULL);
 
            // 创建删除按钮
            hDeleteButton = CreateWindow("BUTTON", "删除",
                WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON | BS_FLAT,
                120, 430, 80, 30, hWnd, (HMENU)IDC_BUTTON_DELETE, g_hInst, NULL);
 
            // 创建清空按钮
            hClearButton = CreateWindow("BUTTON", "清空",
                WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON | BS_FLAT,
                220, 430, 80, 30, hWnd, (HMENU)IDC_BUTTON_CLEAR, g_hInst, NULL);
 
            // 设置字体
            // 创建放大一倍的字体
            HFONT hBigFont = CreateFont(28, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, "Segoe UI");
 
            SendMessage(hWnd, WM_SETFONT, (WPARAM)hFont, MAKELPARAM(TRUE, 0));
            SendMessage(hStartButton, WM_SETFONT, (WPARAM)hFont, MAKELPARAM(TRUE, 0));
            SendMessage(hStopButton, WM_SETFONT, (WPARAM)hFont, MAKELPARAM(TRUE, 0));
            SendMessage(hEditInterval, WM_SETFONT, (WPARAM)hFont, MAKELPARAM(TRUE, 0));
            SendMessage(hComboHotkey, WM_SETFONT, (WPARAM)hFont, MAKELPARAM(TRUE, 0));
            SendMessage(g_hListBox, WM_SETFONT, (WPARAM)hBigFont, MAKELPARAM(TRUE, 0));
            SendMessage(hDeleteButton, WM_SETFONT, (WPARAM)hFont, MAKELPARAM(TRUE, 0));
            SendMessage(hClearButton, WM_SETFONT, (WPARAM)hFont, MAKELPARAM(TRUE, 0));
            SendMessage(hCheckboxTopMost, WM_SETFONT, (WPARAM)hFont, MAKELPARAM(TRUE, 0));
 
            UpdateUIState();
            break;
        }
        case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);
 
            // 绘制按钮背景
            RECT rect;
            GetClientRect(hWnd, &rect);
 
            // 绘制窗口背景
            FillRect(hdc, &rect, hBrush);
 
            // 绘制按钮
            GetClientRect(hStartButton, &rect);
            OffsetRect(&rect, 20, 30);
            FillRect(hdc, &rect, hButtonBrush);
 
            GetClientRect(hStopButton, &rect);
            OffsetRect(&rect, 120, 30);
            FillRect(hdc, &rect, hButtonBrush);
 
            GetClientRect(hDeleteButton, &rect);
            OffsetRect(&rect, 120, 320);
            FillRect(hdc, &rect, hButtonBrush);
 
            GetClientRect(hClearButton, &rect);
            OffsetRect(&rect, 220, 320);
            FillRect(hdc, &rect, hButtonBrush);
 
            // 绘制复选框背景
            GetClientRect(hCheckboxTopMost, &rect);
            OffsetRect(&rect, 220, 30);
            FillRect(hdc, &rect, hBrush);
 
            EndPaint(hWnd, &ps);
            break;
        }
        case WM_CLIPBOARDUPDATE:
        {
            if (OpenClipboard(NULL)) {
                HANDLE hData = GetClipboardData(CF_UNICODETEXT);
                if (hData != NULL) {
                    WCHAR* text = (WCHAR*)GlobalLock(hData);
                    if (text != NULL) {
                        // 检查内容是否已在列表中
                        BOOL found = FALSE;
                        int index = -1;
                        for (int i = 0; i < g_ClipboardRecordCount; i++) {
                            if (wcscmp(g_ClipboardRecords[i], text) == 0) {
                                found = TRUE;
                                index = i;
                                break;
                            }
                        }
 
                        if (found) {
                            // 将该项移到最前面
                            WCHAR* temp = g_ClipboardRecords[index];
                            for (int i = index; i > 0; i--) {
                                g_ClipboardRecords[i] = g_ClipboardRecords[i - 1];
                            }
                            g_ClipboardRecords[0] = temp;
 
                            // 更新列表框
                            SendMessageW(g_hListBox, LB_DELETESTRING, index, 0);
                            SendMessageW(g_hListBox, LB_INSERTSTRING, (WPARAM)0, (LPARAM)temp);
                            SendMessageW(g_hListBox, LB_SETCURSEL, 0, 0);
                        } else {
                            // 添加新项到末尾
                            WCHAR* newText = _wcsdup(text);
                            if (newText != NULL) {
                                // 动态调整记录数组的大小
                                g_ClipboardRecords = (WCHAR**)realloc(g_ClipboardRecords, (g_ClipboardRecordCount + 1) * sizeof(WCHAR*));
                                if (g_ClipboardRecords != NULL) {
                                    g_ClipboardRecords[g_ClipboardRecordCount] = newText;
                                    g_ClipboardRecordCount++;
 
                                    // 将新项移到最前面
                                    for (int i = g_ClipboardRecordCount - 1; i > 0; i--) {
                                        g_ClipboardRecords[i] = g_ClipboardRecords[i - 1];
                                    }
                                    g_ClipboardRecords[0] = newText;
 
                                    // 更新列表框
                                    SendMessageW(g_hListBox, LB_INSERTSTRING, (WPARAM)0, (LPARAM)newText);
                                    SendMessageW(g_hListBox, LB_SETCURSEL, 0, 0);
                                }
                            }
                        }
 
                        GlobalUnlock(hData);
                    }
                }
                CloseClipboard();
            }
            break;
        }
        case WM_CTLCOLORSTATIC:
        {
            HDC hdc = (HDC)wParam;
            HWND hwndStatic = (HWND)lParam;
 
            // 设置背景颜色为浅灰色
            SetBkColor(hdc, RGB(240, 240, 240));
            SetTextColor(hdc, RGB(0, 0, 0)); // 设置文本颜色为黑色
            return (LRESULT)GetStockObject(NULL_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) {
                    char buffer[32];
                    GetWindowTextA(hEditInterval, buffer, 32);
                    g_nInputInterval = atoi(buffer);
                }
            } else if (wmId == IDC_COMBO_HOTKEY) {
                if (HIWORD(wParam) == CBN_SELCHANGE) {
                    int index = SendMessageW(hComboHotkey, CB_GETCURSEL, 0, 0);
                    g_nSelectedHotkey = index;
                }
            } else if (wmId == IDC_BUTTON_DELETE) {
                int index = SendMessageW(g_hListBox, LB_GETCURSEL, 0, 0);
                if (index != LB_ERR) {
                    free(g_ClipboardRecords[index]);
                    for (int i = index; i < g_ClipboardRecordCount - 1; i++) {
                        g_ClipboardRecords[i] = g_ClipboardRecords[i + 1];
                    }
                    g_ClipboardRecordCount--;
                    SendMessageW(g_hListBox, LB_DELETESTRING, index, 0);
 
                    // 删除后,重新设置选中项
                    if (g_ClipboardRecordCount > 0) {
                        int newIndex = min(index, g_ClipboardRecordCount - 1);
                        SendMessageW(g_hListBox, LB_SETCURSEL, newIndex, 0);
                    }
                }
            } else if (wmId == IDC_BUTTON_CLEAR) {
                // 清空列表
                for (int i = 0; i < g_ClipboardRecordCount; i++) {
                    free(g_ClipboardRecords[i]);
                }
                free(g_ClipboardRecords);
                g_ClipboardRecords = NULL;
                g_ClipboardRecordCount = 0;
                SendMessageW(g_hListBox, LB_RESETCONTENT, 0, 0);
            } else if (wmId == IDC_LISTBOX_CLIPBOARD_RECORDS) {
                if (HIWORD(wParam) == LBN_SELCHANGE) {
                    int index = SendMessageW(g_hListBox, LB_GETCURSEL, 0, 0);
                    if (index != LB_ERR && g_ClipboardRecords[index] != NULL) {
                        // 将选中项写入剪贴板
                        if (OpenClipboard(NULL)) {
                            EmptyClipboard();
                            HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, (wcslen(g_ClipboardRecords[index]) + 1) * sizeof(WCHAR));
                            if (hMem) {
                                WCHAR* pText = (WCHAR*)GlobalLock(hMem);
                                wcscpy(pText, g_ClipboardRecords[index]);
                                GlobalUnlock(hMem);
                                SetClipboardData(CF_UNICODETEXT, hMem);
                            }
                            CloseClipboard();
                        }
                    }
                }
            } else if (wmId == IDC_CHECKBOX_TOPMOST) {
                if (HIWORD(wParam) == BN_CLICKED) {
                    g_bTopMost = IsDlgButtonChecked(hWnd, IDC_CHECKBOX_TOPMOST);
                    SetWindowPos(hWnd, g_bTopMost ? HWND_TOPMOST : HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
                }
            }
            break;
        }
        case WM_TIMER:
        {
            if (wParam == TIMER_ID_RESET_INTERVAL) {
                // 停止定时器
                KillTimer(hWnd, TIMER_ID_RESET_INTERVAL);
 
                // 将输入间隔改回10
                g_nInputInterval = 10;
 
                // 更新编辑框的显示
                char buffer[32];
                sprintf(buffer, "%d", g_nInputInterval);
                SetWindowText(hEditInterval, buffer);
            }
            break;
        }
        case WM_CLOSE:
            RemoveClipboardHook();
            DestroyWindow(hWnd);
            break;
        case WM_DESTROY:
        {
            // 释放资源
            DeleteObject(hBrush);
            DeleteObject(hButtonBrush);
            DeleteObject(hButtonHoverBrush);
            DeleteObject(hButtonPressedBrush);
            DeleteObject(hFont);
 
            for (int i = 0; i < g_ClipboardRecordCount; i++) {
                free(g_ClipboardRecords[i]);
            }
            free(g_ClipboardRecords);
            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;
}

剪贴板文本输入器2.0.rar

165.53 KB, 下载次数: 157, 下载积分: 吾爱币 -2 CB

更新了下

免费评分

参与人数 10吾爱币 +16 热心值 +7 收起 理由
rinheespen + 1 热心回复!
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-31 13:25
zzti 发表于 2025-3-31 09:39
代码咋编译呢,用什么环境??

msys2
i686-w64-mingw32-gcc -o clipboard_hook.exe main.c -luser32 -lgdi32 -lkernel32 -lcomctl32 -mwindows
 楼主| 858983646 发表于 2025-3-26 09:41
hummel 发表于 2025-3-26 08:57
强制复制,针对某些网站非注册会员会有用吧!

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

学习通考试无法粘贴答案的时候,就可以用这样的软件
yemind 发表于 2025-3-25 20:38
先收藏了 感谢分享!
zhangxiang998 发表于 2025-3-25 21:07
666666
ZhangPuBi 发表于 2025-3-25 21:10
哇,厉害了。大佬厉害,感谢大佬分享,使用这个必然会省去很多麻烦。
shiqiang 发表于 2025-3-25 21:19
感谢分享,收藏备用。
manglang 发表于 2025-3-25 21:39
谁给个具体的应用场景。
W799699 发表于 2025-3-25 22:01
这个就是粘贴不了白
8970665 发表于 2025-3-25 22:23
试一下这个
asd1234567890 发表于 2025-3-25 22:40
看起来不错,收藏收藏!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2025-5-24 11:54

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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