ANE C API -转换uint8_t字符串到MFC虚拟密钥代码



首先,我提前道歉,因为这可能是一个有点模糊的问题,因为到目前为止,我没有太多的东西可以离开。

我正在编写一个ANE,它需要一个AS3字符串,并将其传递给MFC c++ dll,该dll使用SendInput输入到Windows

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_t转换为int,我当前的错误代码是这样调用sendKeyStroke:

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

再次,这似乎是有效的,但我只是得到一个随机输入。

我也不确定strint(str)的值是什么,因为我还没有弄清楚如何在从AIR调用时进入这段代码。作为旁注,如果有人知道关于调试ANE的任何事情,请随时让我知道:)(我使用VS2012)

我想这个问题的根源可以归结为:

是否可以将const uint8_t转换为相应的虚拟密钥代码?在这种情况下,我一次只处理一个按键。

如果不是,如果dwFlags设置为KEYEVENTF_UNICODE,则KEYBDINPUT wScan似乎也接受unicode字符。是否可以将const uint8_t转换为WORD类型,我可以在wScan中使用?

我一直在使用以下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

谢谢!

如函数所示,字符串被编码为UTF-8 (Unicode), uint8_t用于表示字节。为了与MFC接口,您应该将该字符串转换为UTF-16(也是Unicode)字符串。为此,win32 API和MFC使用WCHAR作为每个16位字的单位。你可以使用MultibyteToWideChar()函数来实现这一点,也许最近的MFC版本也有帮助器,我相信你会找到那些。

现在,关于转换为虚拟键码,恐怕你运气不好。特别是,Unicode没有提供表示光标键、shift、control等的方法,因此UTF-8字符串不会包含这些。不过,在单独的按键中发送字符串的字符可能就足够了。

还有一点:

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

检查文档,但我打赌&len参数是输入和输出!作为输入,它应该接收&str所指向的缓冲区的长度。你使用它的方式,你可能有缓冲区溢出

相关内容

  • 没有找到相关文章

最新更新