Как отправить ключи в свернутое окно в C ++ - PullRequest
4 голосов
/ 09 января 2012

Я только начал изучать C ++. На данный момент я нахожусь в мелочах, решение которых пока не могу найти. Я надеюсь, что кто-то может помочь мне в этом вопросе.

Моя цель: я хочу отправить пару нажатий клавиш в работающее приложение. Но когда приложение не имеет фокуса, то есть свернуто или что-то еще, нажатия клавиш все равно должны быть отправить заявку.

Моя проблема: когда я использую функцию sendkey() с VK_KEY или чем-либо еще (не помню, лол), тогда она работает, НО только если окно развернуто (сфокусировано), но когда я пытаюсь использовать PostMessage(GameWindow, WM_KEYDOWN, 'G', 0); ничего не происходит.

Я пробовал это в Блокноте, но также и в приложении, которое я хочу, чтобы оно работало, но ничего.

Я думаю, что мне нужно подключиться к процессу, а затем отправить ключи, к сожалению, у меня нет проблем с C ++ (если вы не станете полностью профессиональным), но у меня нет опыта работы с перехватами и тому подобными вещами.

Может кто-нибудь прислать мне в правильном направлении или написать небольшой учебник о том, как это сделать, например, в одной из игр для Windows?

if( amount != 0 )
{
    // bring the window to the front
    HWND GameWindow = FindWindow(0, L"Naamloos - Kladblok");
    SetForegroundWindow(GameWindow);

    // execute the loop
    for( int i = 0; i < amount; i++ ){
    // not the last loop so add a pause at the end
    if( i < (amount-1))
    {
        PostMessage(GameWindow, WM_KEYDOWN, 'G', 0);
        PostMessage(GameWindow, WM_KEYUP, 'G', 0);
        Sleep(2000);
    }
    // last loop so dont add a pause at the end
    else
    {
        PostMessage(GameWindow, WM_KEYDOWN, 'G', 0);
        PostMessage(GameWindow, WM_KEYUP, 'G', 0);
    }
    }
}

1 Ответ

3 голосов
/ 24 января 2012

То, как приложение Win32 ведет себя с сообщениями Windows, полностью по своему усмотрению. Возможно, ваше целевое окно / приложение получает сообщения и просто игнорирует их. Вы можете использовать Microsoft Spy ++ (поставляется вместе с Visual Studio), чтобы отслеживать очередь сообщений целевых приложений и видеть, что она получает.

Для чего стоит Notepad (v5.1) выбирает прослушивание сообщений WM_CHAR (вместо WM_KEYDOWN / WM_KEYUP), даже когда они свернуты (пример кода ниже).

#include "stdafx.h"
#include "Windows.h"

int _tmain(int argc, _TCHAR* argv[])
{
    HWND hwndWindowTarget;
    HWND hwndWindowNotepad = FindWindow(NULL, L"Untitled - Notepad");
    if (hwndWindowNotepad)
    {
        // Find the target Edit window within Notepad.
        hwndWindowTarget = FindWindowEx(hwndWindowNotepad, NULL, L"Edit", NULL);
        if (hwndWindowTarget)
        {
            PostMessage(hwndWindowTarget, WM_CHAR, 'G', 0);
        }
    }

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...