WIN32 SendInput仅适用于某些程序 - 包含的代码

时间:2015-06-04 04:02:34

标签: c++ c winapi

我开始研究一个小型机器人项目,作为一种有趣的方式来深入了解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上设置代码。

0 个答案:

没有答案