void KeyPresser::selectWindow() {
SetWinEventHook(EVENT_SYSTEM_FOREGROUND, EVENT_SYSTEM_FOREGROUND, NULL, WinEventProc, 0, 0, WINEVENT_OUTOFCONTEXT);
selectedWindowLabel->setText("请点击目标窗口...");
}
void CALLBACK KeyPresser::WinEventProc(HWINEVENTHOOK hWinEventHook, DWORD event, HWND hwnd, LONG idObject, LONG idChild, DWORD dwEventThread, DWORD dwmsEventTime) {
if (event == EVENT_SYSTEM_FOREGROUND) {
wchar_t windowTitle[256];
GetWindowText(hwnd, windowTitle, 256);
if (KeyPresser::instance) {
KeyPresser::instance->targetHwnd = hwnd;
KeyPresser::instance->selectedWindowLabel->setText(QString::fromWCharArray(windowTitle));
UnhookWinEvent(hWinEventHook);
}
}
}
void KeyPresser::pressKeys(int index) {
if (targetHwnd) {
int key = keyCombos[index]->currentData().toInt();
DWORD dwVKFkeyData; // lParam 参数值
WORD dwScanCode = MapVirtualKey(key, MAPVK_VK_TO_VSC); // 获取虚拟按键的键盘扫描码
dwVKFkeyData = 1;
dwVKFkeyData |= dwScanCode << 16;
dwVKFkeyData |= 0 << 24;
dwVKFkeyData |= 1 << 29;
PostMessage(targetHwnd, WM_KEYDOWN, key, dwVKFkeyData);
// 重置 dwVKFkeyData 以确保 WM_KEYUP 消息正确
dwVKFkeyData = 1;
dwVKFkeyData |= dwScanCode << 16;
dwVKFkeyData |= 0 << 24;
dwVKFkeyData |= 1 << 29;
dwVKFkeyData |= 3 << 30;
PostMessage(targetHwnd, WM_KEYUP, key, dwVKFkeyData);
}
}

https://www.progdomain.com/627/