keybd_event 使って2バイト系文字列を処理するのって、結構大変だったんだよね・・・
いつの間にか、SendInput なるAPIができているらしく、UNICODEで処理できるようになってました。
つうことで、書き上げたモジュールをさらしておきます。
#include <windows.h>
#include <vector>
#include <string>
// マルチバイト文字用(CP_ACP固定w)
void KeyInput( const char *Text_ )
{
std::wstring wstr;
int length = ::MultiByteToWideChar( CP_ACP, 0, Text_, -1, NULL, 0 );
if( length == 0 )
{
return;
}
else
{
wstr.resize( length );
::MultiByteToWideChar( CP_ACP, 0, Text_, -1, &wstr[ 0 ], length );
}
std::vector<INPUT> inputs;
for( int i = 0; i < length; i++ )
{
for( int j = 0; j < 2; j++ )
{
INPUT input;
input.type = INPUT_KEYBOARD;
input.ki.wVk = 0;
input.ki.wScan = wstr[ i ];
input.ki.time = 0;
input.ki.dwExtraInfo = 0;
input.ki.dwFlags = KEYEVENTF_UNICODE;
if( j != 0 )
{
input.ki.dwFlags |= KEYEVENTF_KEYUP;
}
inputs.push_back( input );
}
}
::SendInput( length * 2, &inputs[ 0 ], sizeof( INPUT ) );
return;
}
// VK_xxx 用
void VKeyInput( int *VKeys_, int Count_ )
{
std::vector<INPUT> inputs;
for( int i = 0; i < Count_; i++, VKeys_++ )
{
for( int j = 0; j < 2; j++ )
{
INPUT input;
input.type = INPUT_KEYBOARD;
input.ki.wVk = *VKeys_;
input.ki.wScan = ::MapVirtualKey( *VKeys_, 0 );
input.ki.time = 0;
input.ki.dwExtraInfo = 0;
input.ki.dwFlags = KEYEVENTF_SCANCODE;
if( j != 0 )
{
input.ki.dwFlags |= KEYEVENTF_KEYUP;
}
inputs.push_back( input );
}
}
::SendInput( Count_ * 2, &inputs[ 0 ], sizeof( INPUT ) );
return;
}
動作検証するとき、デバッガでブレークポイントを貼ると、フォーカスがソース上に移るので、ソースが書き変わっちゃって困った(笑)