使用してバックスペースキーを送信できませんでした:: SendInput()ワードパッドアプリケーションに
質問
私はインドの言語用のカスタムキーボードを開発する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
をやっていない試してみましたか?
(また、あなたがキーメッセージは、ターゲット・アプリケーションとどのようにそれはあなたが文字通りのバックスペースを打ったときとは異なりに送信されているもののよりよい手がかりを得るためにスパイ++を使用する場合があります。)