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