あなたの「必」の書き順を教えてください

C#で外部のアプリケーションのリッチテキストコントロールの複数行の文字列を取得したいです。
自分は下のコードを書いたのですが、これだと1行しか取得できませんでした。
どこが悪いでしょうか。
ここでは対象のアプリケーションをA、リッチテキストのコントロールをRichEditとします。
button1をクリックしたら、textbox1にRichEditの内容が表示されるようなものを作ろうとしています。

//ここから
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, int wParam, StringBuilder lParam);

private const int WM_GETTEXT = 0x000D;

private void button1_Click(object sender, EventArgs e)
{
IntPtr hWnd = FindWindow("A", "");
if (hWnd != null)
{

IntPtr hWndChild = FindWindowEx(hWnd, IntPtr.Zero, "RichEdit", "");

StringBuilder strBuilder = new StringBuilder();
SendMessage(hWndChild, WM_GETTEXT, strBuilder.Capacity, strBuilder);

StringReader strReader = new StringReader(strBuilder.ToString());
string stResult = string.Empty;
while (strReader.Peek() >= 0)
{
string stBuffer = strReader.ReadLine();
stResult += stBuffer + System.Environment.NewLine;
}
strReader.Close();
textbox1.Text = stResult;
}
}

A 回答 (1件)

>StringBuilder strBuilder = new StringBuilder();



を、大きめの容量を指定して

StringBuilder strBuilder = new StringBuilder(1000);

のようにしてみてはどうでしょう。

あと、

>StringReader strReader = new StringReader(strBuilder.ToString());
>string stResult = string.Empty;
>while (strReader.Peek() >= 0)
>{
> string stBuffer = strReader.ReadLine();
> stResult += stBuffer + System.Environment.NewLine;
>}
>strReader.Close();
>textbox1.Text = stResult;

でもいいと思いますが、

textbox1.Text = strBuilder.ToString();

とするだけでよいのではないかと思います。
    • good
    • 0
この回答へのお礼

こんな簡単なことだったとは・・・
非常に助かりました。ありがとうございました。

お礼日時:2012/01/03 15:29

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報