2013-01-14 32 views
0

首先,我對此表示歉意,因爲這可能是一個模糊的問題,因爲截至目前我沒有太多的事情可以解決。ANE C API - 將uint8_t字符串轉換爲MFC虛擬密鑰代碼

我在寫一個ANE接受一個AS3字符串並將其關閉,以它輸入到Windows MFC C++ DLL使用SendInput

http://msdn.microsoft.com/en-us/library/windows/desktop/ms646310%28v=vs.85%29.aspx

現在我還沒過程對Flash C API過於熟悉,但我目前的想法是,從AS3傳遞過來的字符串在C端輸入爲const uint8_t,並使用FREGetObjectAsUTF8填充。我使用下面的代碼來實現:

uint32_t len; 
cost uint8_t str; 
FREGetObjectAsUTF8(argv[0], &len, &str); //string is a single char 

要發送的按鍵我使用這個

void KeyboardHelper::sendKeyStroke(int vk){ 
    INPUT input = {0}; 
    input.type = INPUT_KEYBOARD; 
    input.ki.wScan = 0; //not scanning for hardware key 
    input.ki.time = 0; 
    input.ki.dwExtraInfo = 0; 
    //virtual key code for the key we want to press 
    input.ki.wVk = vk; 
    input.ki.dwFlags = 0; //keypress 
    SendInput(1, &input, sizeof(input)); 
} 

input.ki.wVk正在尋找的鍵碼的十六進制值將被髮送。 MSDN有這裏所有的十六進制值和相關按鍵的列表:

http://msdn.microsoft.com/en-us/library/windows/desktop/dd375731%28v=vs.85%29.aspx

此代碼的工作,我能夠從輸入我的AIR應用程序,它只是不正確的密鑰一個按鍵。既然你可以轉換到uint8_tint我目前不正確的代碼是調用sendKeyStroke這樣的:

FREGetObjectAsUTF8(argv[0], &len, &str); //line from above 
keyboardHelper->sendKeyStroke(int(str)); 

同樣,這似乎工作,但我只是得到一個隨機輸入。

我也不是很確定strint(str)的值是什麼,因爲我沒有想到如何從AIR調用這個代碼。作爲一個側面說明,如果有人知道有關調試ANE的隨意讓我知道:)什麼(我使用VS2012)

我想這個問題的根源歸結爲:

是否有可能將const uint8_t轉換爲相應的虛擬鍵碼?在這種情況下,我一次只能處理一個按鍵。

如果不是,它也好像KEYBDINPUT wScan採取一個Unicode字符如果dwFlags設置爲KEYEVENTF_UNICODE。是否有可能將const uint8_t轉換爲我可以在wScan中使用的WORD類型?

我一直在使用下面的MSDN文檔作爲參考:

KEYBDINPUT:http://msdn.microsoft.com/en-us/library/windows/desktop/ms646271%28v=vs.85%29.aspx

SendInput:http://msdn.microsoft.com/en-us/library/windows/desktop/ms646310%28v=vs.85%29.aspx

謝謝!

回答

0

如函數所示,字符串編碼爲UTF-8(Unicode),其中uint8_t用於表示字節。爲了與MFC接口,您應該將該字符串轉換爲UTF-16(也是Unicode)字符串。爲此,win32 API和MFC使用WCHAR作爲每個16位字的單元。你可以使用MultibyteToWideChar()函數來實現這一點,也許更近期的MFC版本也有幫助,我相信你會找到那些。

現在,關於轉換爲虛擬鍵碼,恐怕你運氣不好。特別是,Unicode不提供表示光標鍵,移位,控制等的方法,因此UTF-8字符串將不包含任何這些字符。儘管將字符串的字符發送到單獨的按鍵可能就足夠了。

還要說明一點:

uint32_t len; 
cost uint8_t str; 
FREGetObjectAsUTF8(argv[0], &len, &str); //string is a single char 

檢查文檔,但我打賭,&len參數是輸入和輸出!作爲輸入,它應該接收由&str指向的緩衝區的長度。你使用它的方式,你可能會有緩衝區溢出。

相關問題