跟着(http://win32com.goermezer.de/content/view/136/254/)我能够加载程序,专注于程序,但是我无法将实际的密钥发送到仿真中,就像它发送到窗口一样不在模拟中。
我正在使用的代码如下:
import win32com.client
shell = win32com.client.Dispatch("WScript.Shell")
shell.Run("Silver.gbc")
shell.AppActivate("VisualBoyAdvance")
shell.SendKeys("{DOWN}")
在我尝试发送{DOWN}之前一切正常,我也尝试了“z”并且它不会发送到窗口内部,即使它向任何其他应用程序发送正常。有任何想法吗?提前谢谢。
答案 0 :(得分:1)
问题是SendKey与Direct Input不兼容,为了解决这个问题,我使用win32api的keybd_event进行直接输入
VK_CODE = {
'backspace':0x08
}
def press(*args):
'''
press, release
eg press('x', 'y', 'z')
'''
for i in args:
win32api.keybd_event(VK_CODE[i], 0, 0, 0)
time.sleep(0.2)
win32api.keybd_event(VK_CODE[i],0 ,win32con.KEYEVENTF_KEYUP ,0)
press('backspace')
答案 1 :(得分:0)
由于一些奇怪的原因,Visual Boy Advance似乎既没有响应SendMessage也没有响应keybd_event。但如果你一起使用它们,它就会开始工作。所以在C ++中使用WinAPI(如果需要你可以翻译成Python;我对Python不熟悉),这个sendKeys(窗口,键)方法适用于Visual Boy Advance:
/* Just a struct to make keypress messages more organized and easier to set up */
struct extraKeyInfo {
unsigned short repeatCount;
unsigned char scanCode;
bool extendedKey, prevKeyState, transitionState;
/* Convert this struct's data into the properly-encoded unsigned int on casting */
operator unsigned int()
{
return repeatCount | (scanCode << 16) | (extendedKey << 24) |
(prevKeyState << 30) | (transitionState << 31);
}
};
/* The main method */
void sendKey(HWND hCurrentWindow, BYTE keyval) {
extraKeyInfo lParam = {};
BYTE vkCode=keyval;
lParam.scanCode = MapVirtualKey(vkCode, 0);
keybd_event(vkCode, lParam.scanCode, 0x0, 0x0);
SendMessage(hCurrentWindow, WM_KEYDOWN, vkCode, lParam);
lParam.repeatCount = 1;
lParam.prevKeyState = true;
lParam.transitionState = true;
keybd_event(vkCode, lParam.scanCode, 0x2, 0x0);
SendMessage(hCurrentWindow, WM_KEYUP, vkCode, lParam);
}
请注意,我只在前台测试了VBA,所以如果它在后台可能无法正常工作,但在前台测试中它可以100%正常工作。