Ваш вопрос - деньги! Серьезно . Допустим, маленькая птичка рассказала мне, какая игра вас интересует (начинается с S ). Я сам потратил несколько часов на эту проблему и добился определенного успеха, поэтому я поделюсь им с вами.
Существует инструмент с именем Spy ++ (от Microsoft), который позволяет вам просматривать сообщения, отправляемые в окно / класс. Это отлично подходит для отладки, поскольку позволяет отслеживать сообщения, которые отправляются в поле РЕДАКТИРОВАНИЯ при нажатии клавиши на клавиатуре, поэтому вы можете узнать точные вызовы и параметры, которые отправляются в игру для имитации этой операции.
Используйте spy ++, чтобы открыть игровой процесс, и как только вы войдете в окно входа в игру, вы увидите, что spy ++ сообщает о нескольких потоках, открытых в этом процессе, но только у одного потока будет 3 блока РЕДАКТИРОВАНИЯ. Это тема, которая вас интересует!
Также обратите внимание, что ни в одном из полей EDIT нет заголовка, поэтому следующий код никогда не будет работать:
HWND edit = FindWindowEx(hWnd, NULL, "Edit", NULL);
и, между прочим, всегда проверяйте, что FindWindowEx()
возвращает что-то действительное, иначе как вы узнали бы, что ему удалось найти окно редактирования?
Вместо этого вы должны сделать следующее:
HWND edit = FindWindowEx(hWnd, NULL, "", NULL);
if (!edit)
{
// report error
}
И это найдет первое поле РЕДАКТИРОВАТЬ. Это поле соответствует имени пользователя. В игре используются 3 PostMessage()
звонка для имитации нажатия клавиши, а не SendMessage()
, как вы пытались:
// "..." means you need to find out the other parameters
PostMessage(edit, WM_KEYDOWN, ...);
PostMessage(edit, WM_CHAR, ...);
PostMessage(edit, WM_KEYUP, ...);
Spy ++ покажет другие параметры, не волнуйтесь. Вероятно, вы потратите некоторое время на выяснение того, как построен последний параметр вызова (потому что это маска).
Я не смог отправить ключи в игру, если она была свернута или не была сфокусирована. Вам придется выяснить это. В целях тестирования используйте команду SetForegroundWindow(window_hwnd);
и еще кое-что для фокусировки окна.