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

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

Оффлайн AjaxVS

  • Пользователь
  • Сообщений: 306
    • 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

  • Пользователь
  • Сообщений: 1394
    • Просмотр профиля
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

  • Пользователь
  • Сообщений: 306
    • 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.