Автор Тема: WinAPI не действует на эмуляторы?  (Прочитано 3943 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн AjaxVS

  • Пользователь
  • Сообщений: 305
    • Youtube
    • Просмотр профиля
WinAPI не действует на эмуляторы?
« : 22 Март 2010, 17:16:17 »
Столкнулся с такой проблемой - не могу симитировать нажатие клавиш для эмуляторов с помощью WinAPI32.
Тестировал Gens+, Gens32, Fusion, FCEUltra - эффекта нет, картина одна и та же.
Система - WinXP. Окна эмуляторов на момент имитации имели фокус, были активными.

Вот как я пробовал (код на VB, но это не важно) нажимать кнопку "A" (соотв. клавиша "A" на клавитуре во всех эмулях)..
Для начала посмотрел в MSSpy мессаджи, которые происходят при реальном нажатии  - см. рисунок:
http://i180.photobucket.com/albums/x246/AjaxVS/MSSpy_Emu_messages.png
Потом начал имитировать нажатия с помощью WinApi. все безрезультано:


Что самое непонятное - имитации 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

  • Пользователь
  • Сообщений: 1402
    • Просмотр профиля
Re: WinAPI не действует на эмуляторы?
« Ответ #1 : 22 Март 2010, 19:31:10 »
Есть предположение что эмули юзают DirectIntput / Open(непомню 2 буквы) по этому косяг -_-. А так... посмотри исходники. Скажу одно - хоткеи типо F5,F6 в Gens должны работать (потому что сейчас улучшаю исходники там используется TranlsateAccelerator(...)). Может не на то окно месаги шлёшь?) Короче когда доделаю тут одну вещь, посмотрю (но только Gens).

Оффлайн MaxplantMC

  • Пользователь
  • Сообщений: 42
    • Просмотр профиля
Re: WinAPI не действует на эмуляторы?
« Ответ #2 : 22 Март 2010, 19:31:38 »
Не знаю ка Бэсике. В дельфи делается так
-----------------
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

  • Пользователь
  • Сообщений: 305
    • Youtube
    • Просмотр профиля
Re: WinAPI не действует на эмуляторы?
« Ответ #3 : 22 Март 2010, 19:53:42 »
Есть предположение что эмули юзают DirectIntput
да вроде и имитировал уже проги с директами всякими.. никогда с такими "перенаправлениями" не сталкивался.

Не знаю ка Бэсике. В дельфи делается так
:wow:
MapVirtualKeys - как все просто то!
спасибо, теперь все работает замечательно!  :thumbup:

Оффлайн MaxplantMC

  • Пользователь
  • Сообщений: 42
    • Просмотр профиля
Re: WinAPI не действует на эмуляторы?
« Ответ #4 : 23 Март 2010, 06:53:31 »
а стоит ли делать эмулятор клавиш для эмулятора? масло-маслено получается как-то. :D
да и лучше велосипед не изобретать а использовать проги аналогичные MouseRobot.