2013-01-14 31 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指向的缓冲区的长度。你使用它的方式,你可能会有缓冲区溢出。

相关问题