bool SetClipboardText(const std::string& text) {
// 打开剪贴板
if (!OpenClipboard(nullptr)) {
std::cerr << "无法打开剪贴板" << std::endl;
return false;
}
// 清空剪贴板
EmptyClipboard();
// 分配全局内存(需要+1给结束符)
HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, text.size() + 1);
if (!hMem) {
CloseClipboard();
return false;
}
// 锁定内存并复制数据
char* pMem = static_cast<char*>(GlobalLock(hMem));
memcpy(pMem, text.c_str(), text.size() + 1);
GlobalUnlock(hMem);
// 设置剪贴板数据
SetClipboardData(CF_TEXT, hMem);
// 关闭剪贴板
CloseClipboard();
return true;
}
// 模拟单个按键
void SimulateKeyPress(WORD keyCode, bool extended = false) {
INPUT input[2] = {0};
// 按下按键
input[0].type = INPUT_KEYBOARD;
input[0].ki.wVk = keyCode;
input[0].ki.dwFlags = 0;
if (extended) {
input[0].ki.dwFlags |= KEYEVENTF_EXTENDEDKEY;
}
// 释放按键
input[1].type = INPUT_KEYBOARD;
input[1].ki.wVk = keyCode;
input[1].ki.dwFlags = KEYEVENTF_KEYUP;
if (extended) {
input[1].ki.dwFlags |= KEYEVENTF_EXTENDEDKEY;
}
SendInput(2, input, sizeof(INPUT));
}
// 模拟组合键(如Ctrl+C)
void SimulateCtrlC() {
INPUT inputs[4] = {0};
// 按下Ctrl
inputs[0].type = INPUT_KEYBOARD;
inputs[0].ki.wVk = VK_CONTROL;
// 按下C
inputs[1].type = INPUT_KEYBOARD;
inputs[1].ki.wVk = 'A';
// 释放C
inputs[2].type = INPUT_KEYBOARD;
inputs[2].ki.wVk = 'A';
inputs[2].ki.dwFlags = KEYEVENTF_KEYUP;
// 释放Ctrl
inputs[3].type = INPUT_KEYBOARD;
inputs[3].ki.wVk = VK_CONTROL;
inputs[3].ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(4, inputs, sizeof(INPUT));
}
void SimulateCtrlV() {
INPUT inputs[4] = {0};
// 按下Ctrl
inputs[0].type = INPUT_KEYBOARD;
inputs[0].ki.wVk = VK_CONTROL;
// 按下C
inputs[1].type = INPUT_KEYBOARD;
inputs[1].ki.wVk = 'V';
// 释放C
inputs[2].type = INPUT_KEYBOARD;
inputs[2].ki.wVk = 'V';
inputs[2].ki.dwFlags = KEYEVENTF_KEYUP;
// 释放Ctrl
inputs[3].type = INPUT_KEYBOARD;
inputs[3].ki.wVk = VK_CONTROL;
inputs[3].ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(4, inputs, sizeof(INPUT));
}
// 模拟Shift+字母(大写)
void SimulateShiftKey(WORD keyCode) {
INPUT inputs[4] = {0};
// 按下Shift
inputs[0].type = INPUT_KEYBOARD;
inputs[0].ki.wVk = VK_SHIFT;
// 按下字母键
inputs[1].type = INPUT_KEYBOARD;
inputs[1].ki.wVk = keyCode;
// 释放字母键
inputs[2].type = INPUT_KEYBOARD;
inputs[2].ki.wVk = keyCode;
inputs[2].ki.dwFlags = KEYEVENTF_KEYUP;
// 释放Shift
inputs[3].type = INPUT_KEYBOARD;
inputs[3].ki.wVk = VK_SHIFT;
inputs[3].ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(4, inputs, sizeof(INPUT));
}
// 模拟输入字符串
void TypeString(const std::string& text) {
for (char c : text) {
// 处理大小写
if (isupper(c)) {
SimulateShiftKey(toupper(c));
} else {
SimulateKeyPress(toupper(c));
}
// 小延迟,模拟真实打字速度
std::this_thread::sleep_for(std::chrono::milliseconds(50));
}
}
void MoveMouse(int x, int y) {
double fScreenWidth = ::GetSystemMetrics(SM_CXSCREEN) - 1;
double fScreenHeight = ::GetSystemMetrics(SM_CYSCREEN) - 1;
INPUT input = {0};
input.type = INPUT_MOUSE;
input.mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE;
input.mi.dx = (LONG)(x * (65535.0 / fScreenWidth));
input.mi.dy = (LONG)(y * (65535.0 / fScreenHeight));
::SendInput(1, &input, sizeof(INPUT));
}
// 鼠标点击
void MouseClick() {
INPUT input = {0};
// 按下左键
input.type = INPUT_MOUSE;
input.mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
::SendInput(1, &input, sizeof(INPUT));
// 释放左键
::ZeroMemory(&input, sizeof(INPUT));
input.type = INPUT_MOUSE;
input.mi.dwFlags = MOUSEEVENTF_LEFTUP;
::SendInput(1, &input, sizeof(INPUT));
}
// 右键点击
void RightClick() {
INPUT input = {0};
input.type = INPUT_MOUSE;
input.mi.dwFlags = MOUSEEVENTF_RIGHTDOWN;
::SendInput(1, &input, sizeof(INPUT));
::ZeroMemory(&input, sizeof(INPUT));
input.type = INPUT_MOUSE;
input.mi.dwFlags = MOUSEEVENTF_RIGHTUP;
::SendInput(1, &input, sizeof(INPUT));
}