Разработка и ромхакинг > Ромхакинг и программирование
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.
Навигация
Главная страница сообщений

Перейти к полной версии