【问题标题】:ANE C API - Converting uint8_t String to MFC virtual key codeANE C API - 将 uint8_t 字符串转换为 MFC 虚拟键代码
【发布时间】:2013-01-14 03:00:41
【问题描述】:

首先,我提前道歉,因为这可能是一个有点模糊的问题,因为到目前为止我没有太多的事情要做。

我正在编写一个 ANE,它接受一个 AS3 字符串并将其传递给 MFC C++ 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_UNICODEKEYBDINPUT wScan 似乎也需要一个 unicode 字符。是否可以将const uint8_t 转换为我可以在wScan 中使用的WORD 类型?

我一直使用以下 MSDN 文档作为参考:

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

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

谢谢!

【问题讨论】:

    标签: c++ actionscript-3 mfc air


    【解决方案1】:

    正如函数所暗示的,字符串被编码为 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 指向的缓冲区的长度。你使用它的方式,你可能有缓冲区溢出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-06
      • 1970-01-01
      • 2010-09-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多