2014-02-18 46 views
2

跟着(http://win32com.goermezer.de/content/view/136/254/)一起,我能够加载一个程序,专注于程序,但是我无法将实际的密钥发送到仿真中,就像它正在发送到窗口,而不是仿真。Python 3.3发送密钥到Visual Boy Advance

的,我使用的代码位是这样:

import win32com.client 
shell = win32com.client.Dispatch("WScript.Shell") 
shell.Run("Silver.gbc") 
shell.AppActivate("VisualBoyAdvance") 
shell.SendKeys("{DOWN}") 

所有作品,直到我尝试发送{} DOWN,我也尝试过“Z”,它不会内部发送窗口,即使它发送罚款任何其他应用程序。有任何想法吗?提前致谢。

回答

1

问题是SendKey不与直接输入兼容,让过去这个我用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') 
+0

我遇到过同样的问题,并尝试了您的解决方法,但症状仍然存在。我最终按下了正确的按钮,但仿真器没有收到它们。如果你不介意问我,你还雇用了什么其他组件?另外,您是使用旧的VisualBoyAdvance还是较新的VisualBoyAdvance M?如果后者是32位或64位? – PikalaxALT

+0

这只是VBA,64位。它可能会帮助你知道VK_CODE的不包括箭头,而是数字锁箭头,所以它应该在数字键上按8/4/6/2 – sunshinekitty

+0

其实,我遇到了这个问题,按'A'或'返回“。什么键/值对为你工作? 在笔记上,我的电脑没有数字键盘(15“笔记本),另外我使用的是64位VBA-M,它是建立在VBA源代码上的。 – PikalaxALT

0

出于某种奇怪的原因,视觉男孩进展似乎既不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%可以正常工作。