0

最初に、これは少しあいまいな質問かもしれないので、前もってお詫び申し上げます。

私は、AS3 文字列を受け取り、それを Windows に入力する MFC C++ dll に渡す ANE を作成中です。SendInput

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

現在、私はまだ Flash C API にあまり慣れていませんが、現在、AS3 から渡された文字列はconst uint8_tC 側のように型付けされ、 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送信するキーコードの 16 進値を探しています。MSDN には、すべての 16 進数値と関連するキーストロークのリストがここにあります。

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

このコードは機能し、AIR アプリからキーストロークを入力できますが、正しいキーではありません。私の現在の間違ったコードに変換できるので、次のように呼び出してuint8_tいます。intsendKeyStroke

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

繰り返しますが、これは機能しているように見えますが、ランダムな入力を取得するだけです。

また、AIR から呼び出されたときにこのコードにステップインする方法がわからなかったので、 strorの値もよくわかりません。int(str)補足として、ANE のデバッグについて何か知っている人がいたら、遠慮なく教えてください :) (私は VS2012 を使用しています)

この質問の根源はこれに帰着すると思います:

const uint8_tを対応するバーチャル キー コードに変換することはできますか? この場合、一度に 1 つのキーストロークのみを処理します。

そうでない場合は、が に設定されているKEYBDINPUT wScan場合、Unicode 文字を使用するようにも見えます。で使用できる型に変換することは可能でしょうか?dwFlagsKEYEVENTF_UNICODEconst uint8_tWORDwScan

次の 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

ありがとう!

4

1 に答える 1

0

関数が示すように、文字列はUTF-8(Unicode)としてエンコードされ、uint8_tを使用してバイトを表します。MFCとインターフェイスするには、その文字列をUTF-16(Unicode)文字列に変換する必要があります。そのために、win32 APIとMFCは、各16ビットワードの単位としてWCHARを使用します。関数を使用MultibyteToWideChar()してそれを実現できます。おそらく、最近のMFCバージョンにもそのためのヘルパーがあります。きっと、それらを見つけることができると思います。

さて、仮想キーコードへの変換に関しては、運が悪かったのではないかと思います。特に、Unicodeはカーソルキー、Shift、コントロールなどを表す方法を提供していないため、UTF-8文字列にはこれらのいずれも含まれません。ただし、文字列の文字を別々のキーを押すだけで送信するだけで十分な場合があります。

もう1つの注意:

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

ドキュメントを確認してください、しかし私は&lenパラメータが入力と出力であることは間違いありません!入力として、が指すバッファの長さを受け取る必要があります&str。使用方法によっては、バッファオーバーフローが発生する可能性があります。

于 2013-01-14T06:12:13.917 に答える