我开始研究一个小型机器人项目,作为一种有趣的方式来深入了解win32 api(以及其他内容)。特别是,SendInput仅在某些情况下表现如预期。
作为概念验证,我设置了一个循环来发送's'键,以确保事情正常。如果我将窗口设置为记事本,则文本显示正常。但如果我将窗口设置为Ikaruga,窗口会弹出,但菜单不会改变(游戏使用WASD进行菜单导航,因此它应该不断下降)。
我已经在多个地方读过游戏有一些(不太可靠)选项来阻止外部输入。为了检查是否是这种情况,我找到了一个有人建立密钥发送者的项目。我使用的特定项目是enter link description here。他的代码按照预期向Ikaruga发送了钥匙。
他包含了他的源代码。我花了很多时间阅读它。虽然他正在使用的许多功能已被取代,但整体代码流程类似。
希望有人可以就我的错误提供一些指导。
#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#define _CRT_NONSTDC_NO_DEPRECATE
#endif
#define WINVER 0x0500
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
void AppActivate(LPCTSTR windowTitle){
// Get first window on desktop
HWND firstwindow = FindWindowEx(NULL, NULL, NULL, NULL);
HWND window = firstwindow;
TCHAR windowtext[MAX_PATH];
// Guard against search word matching current console title
TCHAR consoletitle[MAX_PATH];
GetConsoleTitle(consoletitle, MAX_PATH);
while (1){
// Check window title for a match
GetWindowText(window, windowtext, MAX_PATH);
if (strstr(windowtext, windowTitle) != NULL && strcmp(windowtext, consoletitle) != 0){
break;
}
// Get next window
window = FindWindowEx(NULL, window, NULL, NULL);
if (window == NULL || window == firstwindow){
fprintf(stderr, "Window not found\n");
}
}
fprintf(stderr, "Window found: %s\n", windowtext);
// Bring specified window into focus
AllowSetForegroundWindow(true);
ShowWindow(window, SW_RESTORE);
SetForegroundWindow(window);
SetFocus(window);
}
int main(int argc, char* argv[]){
AppActivate("Ikaruga");
Sleep(2000);
// Create a generic keyboard event structure
INPUT ip;
ip.type = INPUT_KEYBOARD;
ip.ki.wVk = 0; // scan code for 's'
ip.ki.time = 0;
ip.ki.dwExtraInfo = 0;
while (1){
// Press the "S" key
ip.ki.wScan = 0x1F; // 0x1F 's'
ip.ki.dwFlags = 0; // 0 for key press
SendInput(1, &ip, sizeof(INPUT));
// Release the "S" key
ip.ki.wScan = 0x1F;
ip.ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(1, &ip, sizeof(INPUT));
char msgbuf[200];
sprintf(msgbuf, "Pressing S\n");
OutputDebugString(msgbuf);
Sleep(2000);
}
return 0;
}
编辑:我忘了提到我已尝试在wVK / wScan和's'与0x53上设置代码。