Python 3.3向Visual Boy Advance发送密钥

时间:2014-02-18 15:35:51

标签: python python-3.x python-3.3 sendkeys

跟着(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”并且它不会发送到窗口内部,即使它向任何其他应用程序发送正常。有任何想法吗?提前谢谢。

2 个答案:

答案 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%正常工作。