テキストを取得すると、改行が削除されます。


ささき まさお  2014-06-27 12:02:51  No: 143487  IP: 192.*.*.*

Microsoft Visual Studio 2008 のVBを使っております。

状況
Autocad と言うソフトに作業履歴を表示するテキストスクリーンがあります。
形状はメモ帳(NotePad)の様な感じで、編集機能は一切ありません。
約400行しか履歴は残りません。(古い物が自動で削除されます)

そこに表示されている履歴(文字)を全て取得しようと思い、APIの
   Public Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Byte()) As Integer
を使い、

        Dim TxtHandle As Integer 'ウインドウのハンドル
        Dim retVal As Integer 
        Dim bytNoteText As Byte() = New Byte(65536) {}
        Dim NoteText As String 
        Public Const WM_GETTEXT As Integer = &HDS

        retVal = SendMessage(TxtHandle, WM_GETTEXT, 65536, bytNoteText)

とする事で、文字列は取得はできたのですが、改行が全て削除されます。
改行も含んで取得する方法は無いでしょうか?


ちなみに、そのウインドウをCtrl+Aで選択し、Ctrl+Cコピーし、メモ帳に貼り付けると、下記の様になります

************************************************************************************

コマンド: offset

現在の設定: 元のオブジェクトを消去=いいえ  画層=元のオブジェクト  OFFSETGAPTYPE=0
オフセット距離を指定 または [通過点(T)/消去(E)/画層(L)] <通過点>: e

オフセット完了後に元のオブジェクトを消去しますか? [はい(Y)/いいえ(N)] <いいえ>: n

オフセット距離を指定 または [通過点(T)/消去(E)/画層(L)] <通過点>: l

オフセットで作成したオブジェクトの画層オプションを指定 [現在の画層(C)/元のオブジェクト(S)] <元のオブジェクト>: s

オフセット距離を指定 または [通過点(T)/消去(E)/画層(L)] <通過点>:

オフセットするオブジェクトを選択 または [終了(E)/元に戻す(U)] <終了>:

************************************************************************************

これが、上記のコードで取得し、メモ帳に貼り付けると全てが1行に表示されます。


宜しくお願いします。

編集 削除
ALFE  2014-07-10 23:40:41  No: 143488  IP: 192.*.*.*

そのソフトを使ったことがないので推測になってしまいますが・・・・
改行コードがLFかCRで取得されているだけな気がします
取得した後の文字列を、Replace(NoteText,VbLf,VbCrLf)としてやってはどうでしょうか?
(VbLfはVbCrかもしれませんが)

編集 削除
ささき まさお  2014-07-17 10:47:01  No: 143489  IP: 192.*.*.*

アドバイスありがとうございます。

説明不足で申し訳ありません。
LFかCRで取得されている可能性も考えて、同様の事も試していたのですが、LFもCRも入っていませんでした。

取得先ハンドルを別のアプリのウインドウに変更して文字を取得すると、改行も取得できましたので、
コードには問題ないと判断しています。

autocadのウインドウが特殊なのかもしれません。
仕方がないので、今はsendkeysで処理していますが、タイミングの問題でエラー(と言うか、別のウインドウに送信)を起こす事があるので、どうにかしたい物ですが。

LF、CR以外に、改行は無いですよね?

編集 削除
魔界の仮面弁士  2014-09-19 12:12:38  No: 143490  IP: 192.*.*.*

クリップボードに転送された内容を、クリップボードビューワの類で
確認して見て下さい。

もしかしたら、CF_UNICODE 形式では改行が入っているのに、
CF_TEXT や CF_LOCALE では改行無しということはないでしょうか。
ANSI API ではなく、Unicode API にして試してみて下さい。


> LF、CR以外に、改行は無いですよね?
NEL、VT、FF、LS、PS などのコードを使う処理系も
世の中にはありますが、WM_GETTEXT や EM_GETTEXTが
通じる相手なら、通常は CR、LF、CRLF のいずれかでしょう。

編集 削除