Столкнулся с такой проблемой - не могу симитировать нажатие клавиш для эмуляторов с помощью 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?
Кто что знает - поделитесь инфой.