Разработка и ромхакинг > Ромхакинг
WinAPI не действует на эмуляторы?
(1/1)
AjaxVS:
Столкнулся с такой проблемой - не могу симитировать нажатие клавиш для эмуляторов с помощью WinAPI32.
Тестировал Gens+, Gens32, Fusion, FCEUltra - эффекта нет, картина одна и та же.
Система - WinXP. Окна эмуляторов на момент имитации имели фокус, были активными.
Вот как я пробовал (код на VB, но это не важно) нажимать кнопку "A" (соотв. клавиша "A" на клавитуре во всех эмулях)..
Для начала посмотрел в MSSpy мессаджи, которые происходят при реальном нажатии - см. рисунок:
http://i180.photobucket.com/albums/x246/AjaxVS/MSSpy_Emu_messages.png
Потом начал имитировать нажатия с помощью WinApi. все безрезультано:
Имитация - способ #1:
Call PostMessage(eHwnd, WM_KEYDOWN, &H41, &H1E0001)
Call PostMessage(eHwnd, WM_CHAR, &H61, &H1E0001)
Call PostMessage(eHwnd, WM_KEYUP, &H41, &HC01E0001)
Происходит ерунда.
имитация - способ #2:
Call PostMessage(eHwnd, WM_KEYDOWN, &H41, &H1E0001)
Sleep 100 'здесь и далее - время слипа пробовал разные, эффект один и тот же
Call PostMessage(eHwnd, WM_CHAR, &H61, &H1E0001)
Sleep 100
Call PostMessage(eHwnd, WM_KEYUP, &H41, &HC01E0001)
Уже лучше.
Имитация - способ #3:
Call PostMessage(eHwnd, WM_KEYDOWN, &H41, &H1E0001)
Sleep 100
Call PostMessage(eHwnd, WM_KEYUP, &H41, &HC01E0001)
То, что нужно - MSSpy показывает те же мессаджи.
Имитация - способ #4 - безотказный и проверенный мною для других целей много раз:
vk = vbKeyA 'соответсвует VK_A из WinAPI.
Call keybd_event(vk, 0, 0, 0)
Sleep 100
Call keybd_event(vk, 0, 2, 0)
Опять не работает. Как это возможно?! Никогда такого не видел!
Имитация - спобоб #5
Call SendMessage(eHwnd, WM_KEYDOWN, &H41, &H1E0001)
Sleep 100
Call SendMessage(eHwnd, WM_CHAR, &H61, &H1E0001)
Sleep 100
Call SendMessage(eHwnd, WM_KEYUP, &H41, &HC01E0001)
Вообще не похоже на оригинал.
Что самое непонятное - имитации F5-F6-F7 (сохранения-слоты на 16bit) вроде как и происходит, но непонятно чего. в Gens32 срабатывает сохранение/загрузка(F6-F7, хотя должны быть слоты), в Gens+ включается турбо-режим(он у меня вообще на клавише "C"!), в Fusion не происходит ничего. в общем, творится не понятно что, но явно не то, что нужно.
F8 - загрузка - в Gens32 имитируется правильно (!)
Пробовал назначить кнопке A другие клавиши (F1-F4, Shift) - имитаций не происходит.
В общем: вопросы:
1. почему "глобальная" имитация с помощью keybd_event не срабатывает?
2. как с помощью WinAPI (какие wParam/lParam) имитировать нажатия кнопок в эмуляторах 8-16 bit?
Кто что знает - поделитесь инфой.
r57shell:
Есть предположение что эмули юзают DirectIntput / Open(непомню 2 буквы) по этому косяг -_-. А так... посмотри исходники. Скажу одно - хоткеи типо F5,F6 в Gens должны работать (потому что сейчас улучшаю исходники там используется TranlsateAccelerator(...)). Может не на то окно месаги шлёшь?) Короче когда доделаю тут одну вещь, посмотрю (но только Gens).
MaxplantMC:
Не знаю ка Бэсике. В дельфи делается так
--- Код: --------------------
implementation
const
ExtendedKeys: set of Byte = [ // incomplete list
VK_INSERT, VK_DELETE, VK_HOME, VK_END, VK_PRIOR, VK_NEXT,
VK_LEFT, VK_UP, VK_RIGHT, VK_DOWN, VK_NUMLOCK
];
------------------
procedure SimulateKeyDown(Key : byte);
var
flags: DWORD;
begin
if Key in ExtendedKeys then flags := KEYEVENTF_EXTENDEDKEY else flags := 0;
keybd_event(Key, MapVirtualKey(Key, 0), flags, 0);
end;
procedure SimulateKeyUp(Key : byte);
var
flags: DWORD;
begin
if Key in ExtendedKeys then flags := KEYEVENTF_EXTENDEDKEY else flags := 0;
keybd_event(Key, MapVirtualKey(Key, 0), KEYEVENTF_KEYUP or flags, 0);
end;
----------------------
SimulateKeyDown(Key);
sleep(100);
SimulateKeyUp(Key);
--- Конец кода ---
используя keybd_event нужно обязательно передавать ScanCode.
и вместо keybd_event лучше использовать sendinput
AjaxVS:
--- Цитата: r57shell от 22 Марта 2010, 19:31:10 ---Есть предположение что эмули юзают DirectIntput
--- Конец цитаты ---
да вроде и имитировал уже проги с директами всякими.. никогда с такими "перенаправлениями" не сталкивался.
--- Цитата: MaxplantMC от 22 Марта 2010, 19:31:38 ---Не знаю ка Бэсике. В дельфи делается так
--- Конец цитаты ---
:wow:
MapVirtualKeys - как все просто то!
спасибо, теперь все работает замечательно! :thumbup:
MaxplantMC:
а стоит ли делать эмулятор клавиш для эмулятора? масло-маслено получается как-то. :D
да и лучше велосипед не изобретать а использовать проги аналогичные MouseRobot.
Навигация
Перейти к полной версии