質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

Q&A

解決済

1回答

807閲覧

C#で別アプリのRICHTEXTBOXの最終行(指定行)のみを取得したい。

MagiSystem

総合スコア10

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

0グッド

0クリップ

投稿2017/12/17 06:36

編集2017/12/17 13:10

###前提・実現したいこと

・ある端末に接続されたターミナル機能を持つアプリ(ターミナル部はRICHTEXTBOXコントロール)に対して、設定コマンド、取得コマンドを発行するC#のアプリを作っています。
・ターミナル機能を持つアプリ(別アプリ)は外部で作成されたソフトのためソースコード等はありません。
・別アプリはターミナル機能で、端末状態の設定コマンド、取得コマンドが利用可能で、C#のアプリ仕様として、C#のアプリが端末に対して直接ではなく、別アプリのターミナル機能を経由して、設定コマンド発行、取得コマンド発行による情報取得を行う必要があります。

・そのため、C#のアプリから別アプリのRICHTEXTBOXに対して、設定コマンドの文字列の送信、取得コマンドの文字列の送信と、取得コマンドによってターミナル部に出力された文字列結果の読込みが必要ですが、文字列の送信はできており、文字列結果の読込みは最終行もしくは指定行の読込みを行いたいです。

###発生している問題

現在、C#から別アプリのRICHTEXTBOXのウィンドウハンドルを取得して、WM_GETTEXTで指定した文字数分を取得することは可能なのですが、別アプリのRICHTEXTBOX側の行数が時間と共に増えていくため、
指定するサイズも読めず、C#から別アプリのRICHTEXTBOXの最終行(指定行)のみを取得するなど、何か方法はないでしょうか?

###該当のソースコード
別アプリのRICHTEXTBOXのウィンドウハンドル(hWnd)を取得して、WM_GETTEXTで指定した文字数分を取得することは可能だが、ターミナル部なので何行なのか、何文字なのか分からない。
最終行、指定行などで部分的に読み出しできるなどよい方法はないでしょうか?

C#

1uint WM_GETTEXT = 0x000D; 2StringBuilder sb = new StringBuilder(256); 3SendMessage((IntPtr)hWnd, (UInt32)WM_GETTEXT, (int)255, sb);

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

RICHTEXTBOX ではなくリッチエディットだと推定します。

WM_GETTEXT には 64KB 制限があるそうです。私なら Ctrl+End, Shift+Home を SendInput して最終行を選択して EM_GETSELTEXT するか、EM_STREAMOUT を使用して最終 2 ブロックのみを保存し、そこから最終行を抽出すると思います。

または少し手間がかかりますが、入力メッセージをフックしてローカルに常にリッチエディットの内容のコピーを作るという手もあります。

投稿2017/12/18 07:00

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MagiSystem

2017/12/18 12:36

回答ありがとうございます。ご指摘の通り、RICHEDITでした。 申し訳ありません。 Ctrl+End, Shift+Homeをして最終行を選択するという発想がなかったのでありがとうございます。ご回答を頂いた内容そのものではまだ試していないのですが、下記は試してみました。 SetForegroundWindow(対象ウィンドウハンドル)でアクティブにして Ctrl+End, Shift+Home をSendkeysして最終行を選択して EM_GETSELTEXTでSendMessage をしてみたところ、対象ウィンドウハンドルのアプリとC#アプリが共にハングしてしまうのですが、やはり SendInput を用いないとだめなのでしょうか?
Zuishin

2017/12/18 12:41

SendKeys でハングアップするなら SendInput でも同じ結果が予想されます。 どうしてハングアップするか突き止めるより別の方法をとった方が早いかもしれません。
MagiSystem

2017/12/18 13:24

コメントありがとうございます。 かなり惜しい感じなのでもう少し調べてみようと思います。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問