使用してバックスペースキーを送信できませんでした:: SendInput()ワードパッドアプリケーションに

StackOverflow https://stackoverflow.com/questions/2421485

質問

私はインドの言語用のカスタムキーボードを開発するsendinput()関数とWindowsのキーボードフックを使用していました。 プロジェクトは、ここでGoogleのコードである: http://code.google.com/p/ekalappaiする

keyboadフックとsendinput機能はのWin32 DLLに配置されます。そして、彼らは、Qtのexeファイルから呼び出されます。 私たちのアプリケーションは、ほとんどのキーとアプリケーションのため正常に動作します。私は、次の問題を探します:

私は、ワードパッド/ OpenOfficeの/ MSOfficeのようないくつかのアプリケーションにBackspaceキーを送信できませんでした。私はArrowkeysと同じ問題を見つけて、キーを削除します。

ここに私のコードは次のとおりです。

extern "C" __declspec(dllexport) void GenerateKey(int vk , bool bExtended)
{
    //update previous characters
    previous_2_character = previous_1_character;
    previous_1_character = vk;

    KEYBDINPUT kb={0};
    INPUT Input={0};

    //keydown
    kb.wVk    =  0;
    kb.wScan = vk;/*enter unicode here*/;
    kb.dwFlags = KEYEVENTF_UNICODE; // KEYEVENTF_UNICODE=4
    Input.type = INPUT_KEYBOARD;
    Input.ki = kb;

    ::SendInput(1,&Input,sizeof(Input));

    //keyup
    kb.wVk    =  0;
    kb.wScan = vk;/*enter unicode here*/;
    kb.dwFlags = KEYEVENTF_UNICODE|KEYEVENTF_KEYUP; //KEYEVENTF_UNICODE=4
    Input.type = INPUT_KEYBOARD;
    Input.ki = kb;

    ::SendInput(1,&Input,sizeof(Input));
}

全DLLコードはここにある: HTTP ://code.google.com/p/ekalappai/source/browse/trunk/ekhook/ekhook/dllmain.cppする

電話番号:

generatekey = (GenerateKey) myLib->resolve( "GenerateKey" );

generatekey(44,FALSE); //comma - THis works in wordpad/MsOffice/Openoffice
generatekey(2949,FALSE); //tamil character "a" works in Wordpad/Msoffice/Openoffice

generatekey(8,FALSE); //backspace - This is NOT working in Wordpad/Msoffice/Openoffice

Qtのエグゼからの完全な呼び出し元のコードはここにあります: http://code.google.com/p/ ekalappai /ソース/閲覧/トランク/ ekalappai / window.cppする

私はグーグルで検索しようとしたが、まだ解決策を微ことができませんでした。誰もがこれを解決する上での手掛かりを持っている場合は、ヘルプをPLSの。おかげます。

役に立ちましたか?

解決

あなたは仮想キーとスキャンコードを混合しています。 wVkメンバーは、スキャンコードのみ仮想キーがあいまいであることを使用される、重要なものです。修正:

kb.wVk   = vk;
kb.wScan = 0;   // TODO: look at VkKeyScanEx()

他のヒント

ドキュメントは言う:

KEYEVENTF_UNICODEが指定されている場合は、
は、SendInputはVK_PACKETに等しいwParamの前景スレッドのメッセージキューにWM_KEYDOWNまたはWM_KEYUPメッセージを送信します。 GetMessageかのPeekMessageがこのメッセージを取得すると、TranslateMessageにメッセージを渡すことは、もともとwScanで指定されたUnicode文字とWM_CHARメッセージをポストします。

ただの推測ではなく、ワードプロセッシングプログラムは、WM_CHAR WM_KEYDOWN / WM_KEYUPメッセージのではなくオフバックスペースの動作をトリガすることがあります。したがって、彼らは、それらのメッセージのwParamにとしてVK_BACKSPACE(ないVK_PACKET)を期待することができます。それも、ほとんど何でも可能であるので、あなたは、Windows上だ、一体... VKEYsない文字に基づいてアクセラレータで行われることがあります。 :)

あなたはKEYEVENTF_UNICODEを使用して、そしてkb.wVk = VK_BACKSPACEをやっていない試してみましたか?

(また、あなたがキーメッセージは、ターゲット・アプリケーションとどのようにそれはあなたが文字通りのバックスペースを打ったときとは異なりに送信されているもののよりよい手がかりを得るためにスパイ++を使用する場合があります。)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top