私は、アプリケーションにテキストを書き込むためにユーザのキーボードを処理する関数を書いていました。ToUnicodeExが "Greater Than"を印刷しない
これを行うには、私はToUnicodeEx関数を使用して、キー状態の配列を使用します。 この関数は、可能なすべての入力に対して完璧に機能しています。「SHIFT + <」の組み合わせであると思われる「>」記号は表示できません。代わりに「<」という記号が表示されますSHIFTキーは押されず、押されたことが分かります。
誰かがすでに同じことを経験していて、問題の内容を知っていますか?あなたは以下の私の機能コードを見つけます
:
void MyFunction(bool bCapsLockDown)
{
IOClass io = GetMyIOInstance();
HKL layout = GetKeyboardLayout(0);
uchar uKeyboardState[256];
WCHAR oBuffer[5] = {};
//Initialization of KeyBoardState
for (uint i = 0; i < 256; ++i)
{
uKeyBoardState[i] = 0;
}
// Use of my ConsultKeyState to get the status of pressed keys
if (ConsultKeyState(VK_SHIFT) || bCapsLockDown)
{
uKeyboardState[VK_CAPITAL] = 0xff;
}
if (ConsultKeyState(VK_CONTROL))
{
uKeyboardState[VK_CONTROL] = 0xff;
}
if (ConsultKeyState(VK_MENU))
{
uKeyboardState[VK_MENU] = 0xff;
}
if (ConsultKeyState(VK_RMENU))
{
uKeyboardState[VK_MENU] = 0xff;
uKeyboardState[VK_CONTROL] = 0xff;
}
for (uint iVK = 0; iVK < 256; ++iVK)
{
bool bKeyDown = ConsultKeyState(iVK) != 0;
uint iSC = MapVirtualKeyEx(iVK, MAPVK_VK_TO_VSC, layout);
bool bKeyAlreadyDown = io.KeysDown[iVK];
io.KeysDown[iVK] = bKeyDown;
if (io.KeysDown[iVK] && bKeyAlreadyDown == false)
{
int iRet = ToUnicodeEx(iVK, iSC, uKeyboardState, (LPWSTR)oBuffer, 4, 0, layout);
if(iRet > 0 && (iswgraph((unsigned short) oBuffer[0]) || oBuffer[0] == ' '))
io.AddInputCharacter((unsigned short) oBuffer[0]);
}
}
}
編集: 要約すると、私の質問は: ">" が表示得るための良い組み合わせVirtualKey + KeyBoardStateでしょうか?
@HansPassant "MAJ"情報は、uKeyBoardState!に含まれています。 ToUnicodeExは、MAJ、ALT、CTRLなどの他のキーが押されているかどうかを知るために使用します。 – realUser404
英語のウェブサイトでフランス語を避けるのがベストです。 GetKeyboardState()は非常に奇妙です。あなた自身のプロセスのバッファリングされたキーボード状態を取得します。そうでなければメッセージループをポンピングしないと更新されません。 GetAsyncKeyState()を使用してこの問題を回避したように見えますが、これは必ずしもポークしようとしているプロセスのキーボードの状態と一致しないため、正しくありません。 UIオートメーションの使用は、このような問題を回避するために常にベストです。 –
Oups、シフトについて申し訳ありません、すぐに編集するつもりです – realUser404