2014-02-18 47 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%可以正常工作。