SendMessageのWM_GETTEXTとWM_GETTEXTLENGTHで大幅に文字数が異なる
while(true){ //<=実際には何かしらの条件
/*何らかの処理、ただし、hwndのテキストはコード側ではいじらない*/
//hwnd<-対象のハンドル
var sb = new StruingBuilder();
var length = SendMessage(hwnd,WM_GETTEXTLENGTH,0,0);
sb.Capacity = length+1; //追記2
Console.WriteLine("before length:"+ length);
Thread.Sleep(200); //無くても同じ
length = SendMessage(hwnd,WM_GETTEXT,length+1,sb);
Console.WriteLine("before length:"+ length);
/*何らかの処理、ただし、hwndのテキストはコード側ではいじらない*/
}
上記プログラムを実行すると
before length:212
after length:91
と何度もなってしまいます。
また、ターゲットのアプリケーションの最新版ではどの状況でも文字数が一致するのですが、古いバージョンでは上記のように一致する時としない時とあります。
どういった原因が考えられるでしょうか。以上、よろしくお願いいたします。
追記:
sbには実際の文字列が途切れて格納されていました。
追記2:
sbのCapacityは設定しておりましたが、転記ミスで抜けていました。せっかくご回答いただいたのに大変失礼いたしました。申し訳ございません。
追記3:
下記のように、試しに取得する長さを変更(length * 10)しましたが、得られる文字列はやはり途切れておりました。
while(true){ //<=実際には何かしらの条件
/*何らかの処理、ただし、hwndのテキストはコード側ではいじらない*/
//hwnd<-対象のハンドル
var sb = new StruingBuilder();
var length = SendMessage(hwnd,WM_GETTEXTLENGTH,0,0);
sb.Capacity = length *10 +1;
Console.WriteLine("before length:"+ length);
Thread.Sleep(200); //無くても同じ
length = SendMessage(hwnd,WM_GETTEXT,length *10 +1,sb);
Console.WriteLine("before length:"+ length);
/*何らかの処理、ただし、hwndのテキストはコード側ではいじらない*/
}