[C#][Win32] 文字列をウィンドウに送信

あるウィンドウ(エディットコントロールなど)に文字列を送信する方法を考えていたのだが、色々調べた結果、WM_IME_CHAR メッセージで、wParam にS-JIS文字コードを指定して、1文字ずつ送信する方法しかないという結論になった。
他の方法として、

  1. WM_SETTEXT メッセージで文字列送信
  2. EM_REPLACESEL などを駆使して文字列送信
  3. クリップボードに送信したい文字列を格納して、WM_PASTE メッセージを送信

というのが考えられるが、WM_SETTEXTは全文字列の置き換えしかなく、3文字目にこの文字を入れたい!なんてときに、いったんWM_GETTEXTで取得して、3文字から指定文字列を挿入して、またWM_SETTEXTで送信、、、となってしまうし、なにより文字数が多かったら死ぬ。
EM_REPLACESEL を使って、という方法はかなり複雑なことまでできそうだが、非常にめんどくさいので却下。
また、WM_PASTEメッセージはVC.netのエディタのような裏でごちゃごちゃやるようなアプリケーションではどうもうまくいかない。

なのでひとまず素直に1文字ずつ送信することにしてみた。以下、そのプログラム。Formのエディットボックスに入力された文字列を m_LastHWND というウィンドウに送信しているプログラム。一応2バイトコードかどうか見ながら送信している。


// S-JIS文字コード変換
byte[] str_bytes = System.Text.Encoding.GetEncoding(932).GetBytes(str);

for( int i=0; i<str_bytes.Length; ++i )
{
if( (0x81<=str_bytes[i] && str_bytes[i]<=0x9f) || (0xe0<=str_bytes[i] && str_bytes[i]<=0xFC) )
{ // 2バイト文字

// これが最後の文字だったらおかしい
System.Diagnostics.Debug.Assert(i<str_bytes.Length-1);
if( str_bytes.Length-1 == i )
{ // おかしい・・
return 1;
}

// 一応、ほんとに2バイト文字かどうか、2バイト目を確認
++i;
System.Diagnostics.Debug.Assert( (0x40<=str_bytes[i] && str_bytes[i]<=0x7E) || (0x80<=str_bytes[i] && str_bytes[i]<=0xEC) );
if( (0x40<=str_bytes[i] && str_bytes[i]<=0x7E) || (0x80<=str_bytes[i] && str_bytes[i]<=0xEC) )
{
Win32.PostMessage( m_LastHWND, Win32.WM_IME_CHAR, (uint)((str_bytes[i-1]<<8) | str_bytes[i]), 0 );
}
else
{ // おかしい・・
return 1;
}
}
else
{ // 1バイト文字
Win32.PostMessage( m_LastHWND, Win32.WM_IME_CHAR, str_bytes[i], 0 );
}
}