C语言版本 {#more-636}
#include <Windows.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
// 定义一个快捷键的 ID
#define HOTKEY_ID 100
void SimulateTyping(const wchar_t\* text) {
// 这个函数和你原来的一样,不用改
INPUT input;
input.type = INPUT_KEYBOARD;
input.ki.time = 0;
input.ki.dwExtraInfo = 0;
for (int i = 0; i < wcslen(text); i++) {
wchar_t ch = text[i];
if (ch == L'\n') {
// 模拟按下 Shift 键
input.ki.wVk = VK_SHIFT;
input.ki.wScan = 0;
input.ki.dwFlags = 0;
SendInput(1, &input, sizeof(INPUT));
// 模拟按下 Enter 键
input.ki.wVk = VK_RETURN;
input.ki.wScan = 0;
input.ki.dwFlags = 0;
SendInput(1, &input, sizeof(INPUT));
// 松开 Shift 键和 Enter 键
input.ki.wVk = VK_RETURN;
input.ki.wScan = 0;
input.ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(1, &input, sizeof(INPUT));
input.ki.wVk = VK_SHIFT;
input.ki.wScan = 0;
input.ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(1, &input, sizeof(INPUT));
}
else {
// 模拟普通字符的输入
input.ki.wVk = 0;
input.ki.wScan = ch;
input.ki.dwFlags = KEYEVENTF_UNICODE;
SendInput(1, &input, sizeof(INPUT));
input.ki.dwFlags = KEYEVENTF_KEYUP | KEYEVENTF_UNICODE;
SendInput(1, &input, sizeof(INPUT));
}
Sleep(10);
}
}
void CopyAndType() {
// 这个函数是用来复制剪切板内容并模拟键盘输出的
if (!OpenClipboard(NULL)) {
fprintf(stderr, "无法打开剪切板\\n");
return;
}
HANDLE hData = GetClipboardData(CF_UNICODETEXT);
if (hData == NULL) {
fprintf(stderr, "无法获取剪切板数据\n");
CloseClipboard();
return;
}
wchar_t* clipboardText = (wchar_t*)GlobalLock(hData);
if (clipboardText == NULL) {
fprintf(stderr, "无法锁定剪切板数据\n");
CloseClipboard();
return;
}
CloseClipboard();
// 模拟键盘输出
SimulateTyping(clipboardText);
GlobalUnlock(hData);
}
int main() {
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsole, FOREGROUND_GREEN);
// 重置为默认颜色
SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
const char* lines[] = {
"使用帮助:这个程序能够帮助你将剪切板内容模拟为键盘输出。",
"教程:复制好答案后运行程序,然后按下 ctrl+/ 再点击编译器窗口即可" // 修改了这里的快捷键
};
int maxWidth = 0;
for (int i = 0; i < 2; i++) {
if (strlen(lines[i]) > maxWidth) {
maxWidth = strlen(lines[i]);
}
}
printf("**********************************\n");
for (int i = 0; i < 2; i++) {
int padding = maxWidth - strlen(lines[i]);
char formattedLine[100];
printf(formattedLine, "* %s%*s *", lines[i], padding, "");
printf("%s\n", formattedLine);
}
printf("**********************************\n");
Sleep(1000);
// 注册快捷键 ctrl+/
if (!RegisterHotKey(NULL, HOTKEY_ID, MOD_CONTROL, VK_OEM_2)) { // 修改了这里的虚拟键码
fprintf(stderr, "无法注册快捷键\n");
return 1;
}
// 创建一个消息循环
MSG msg = { 0 };
while (GetMessage(&msg, NULL, 0, 0) != 0) {
if (msg.message == WM_HOTKEY) {
// 如果收到快捷键消息,就调用复制和输出的函数
CopyAndType();
}
}
return 0;
}
</code>
</pre>
C++优化版
------
#include <Windows.h>
#include <iostream>
#include <string>
#include <chrono>
#include <thread>
#include <iomanip>
#include<vector>
// 定义一个快捷键的 ID
#define HOTKEY_ID 100
void SimulateTyping(const std::wstring\& text) {
// 这个函数和你原来的一样,不用改
INPUT input;
input.type = INPUT_KEYBOARD;
input.ki.time = 0;
input.ki.dwExtraInfo = 0;
for (wchar_t ch : text) {
if (ch == L'\n') {
// 模拟按下 Shift 键
input.ki.wVk = VK_SHIFT;
input.ki.wScan = 0;
input.ki.dwFlags = 0;
SendInput(1, &input, sizeof(INPUT));
// 模拟按下 Enter 键
input.ki.wVk = VK_RETURN;
input.ki.wScan = 0;
input.ki.dwFlags = 0;
SendInput(1, &input, sizeof(INPUT));
// 松开 Shift 键和 Enter 键
input.ki.wVk = VK_RETURN;
input.ki.wScan = 0;
input.ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(1, &input, sizeof(INPUT));
input.ki.wVk = VK_SHIFT;
input.ki.wScan = 0;
input.ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(1, &input, sizeof(INPUT));
}
else {
// 模拟普通字符的输入
input.ki.wVk = 0;
input.ki.wScan = ch;
input.ki.dwFlags = KEYEVENTF_UNICODE;
SendInput(1, &input, sizeof(INPUT));
input.ki.dwFlags = KEYEVENTF_KEYUP | KEYEVENTF_UNICODE;
SendInput(1, &input, sizeof(INPUT));
}
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
}
void CopyAndType() {
// 这个函数是用来复制剪切板内容并模拟键盘输出的
if (!OpenClipboard(nullptr)) {
std::cerr \<\< "无法打开剪切板" \<\< std::endl;
return;
}
HANDLE hData = GetClipboardData(CF_UNICODETEXT);
if (hData == nullptr) {
std::cerr << "无法获取剪切板数据" << std::endl;
CloseClipboard();
return;
}
wchar_t* clipboardText = static_cast<wchar_t*>(GlobalLock(hData));
if (clipboardText == nullptr) {
std::cerr << "无法锁定剪切板数据" << std::endl;
CloseClipboard();
return;
}
CloseClipboard();
// 模拟键盘输出
SimulateTyping(clipboardText);
GlobalUnlock(hData);
}
int main() {
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsole, FOREGROUND_GREEN);
// 重置为默认颜色
SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
std::vector<std::string> lines = {
"使用帮助:这个程序能够帮助你将剪切板内容模拟为键盘输出。",
"教程:复制好答案后运行程序,然后按下 ctrl+/ 再点击编译器窗口即可" // 修改了这里的快捷键
};
int maxWidth = 0;
for (const std::string& line : lines) {
if (line.length() > maxWidth) {
maxWidth = line.length();
}
}
std::cout << "**********************************" << std::endl;
for (const std::string& line : lines) {
int padding = maxWidth - line.length();
std::string formattedLine = "* " + line + std::string(padding, ' ') + " *";
std::cout << formattedLine << std::endl;
}
std::cout << "**********************************" << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(1));
// 注册快捷键 ctrl+/
if (!RegisterHotKey(NULL, HOTKEY_ID, MOD_CONTROL, VK_OEM_2)) { // 修改了这里的虚拟键码
std::cerr << "无法注册快捷键" << std::endl;
return 1;
}
// 创建一个消息循环
MSG msg = { 0 };
while (GetMessage(&msg, NULL, 0, 0) != 0) {
if (msg.message == WM_HOTKEY) {
// 如果收到快捷键消息,就调用复制和输出的函数
CopyAndType();
}
}
return 0;
}
</code>
</pre> <!--<div class="oshimai"></div>--> <!--<h2 style="opacity:0;max-height:0;margin:0">Comments</h2>--> <!-- 评论跳转标记 -->