1

プログラムに関係のないウィンドウから情報を「読み」たい。プロセスIDとウィンドウハンドルがある場合:

Process Proc = Process.GetProcessById(ProcID);
IntPtr hdl = Proc.MainWindowHandle;

また、spy ++から、関心のある要素のcontrol-IDが00000003EAであるという情報がありますが、C#でアクセスするにはどうすればよいですか?

ご協力いただきありがとうございます!

編集_____________________________________

誰かが興味を持っている場合、これは私がそれを機能させた方法です:

Process p = Process.GetProcessById(ProcID);
IntPtr hdl = p.MainWindowHandle;
byte[] buffer = new byte[1024]; //Assume that 1024 bytes are enough! Better would be to get the text length..
UTF8Encoding enc = new UTF8Encoding();
uint Test = GetDlgItemText((int)hdl, Convert.ToInt32("0x000003EA", 16), buffer, 1024);
string TextFromOtherWindow = enc.GetString(buffer);

[DllImport("user32.dll")]
public static extern uint GetDlgItemText(
 int hDlg,           //A handle to the dialog box that contains the control. 
 int nIDDlgItem,     //The identifier of the control whose title or text is to be retrieved. 
 byte[] lpString,      //The buffer to receive the title or text. 
 int nMaxCount       //The maximum length, in characters, of the string to be copied to the 
 //buffer pointed to by lpString. If the length of the string, including 
 //the null character, exceeds the limit, the string is truncated. 
);

byte[] buffer他のウィンドウからのテキストが書き戻されるバッファです。テキストの長さは1024バイト以下だと思いましたが、実際のサイズを取得する方がよいでしょう…</ p>

エンコーディングに関しては、別のエンコーディングの方がニーズに適している場合があります。

16進数のハンドルは整数に変換する必要があります。Convert.ToInt32("0x000003EA", 16)

GetDlgItemTextは、「<strong>SendMessage」や「<strong>WM_GETTEXT」ではなく、静的テキストを取得するという私の要件に最も適していました(私は思います)。

私を正しい方向に向けるのを手伝ってくれたすべての人に感謝します!

GetDlgItemTextのソース:MSDN

編集_________________________________

うーん。話が早すぎました...プログラムを起動するたびに要素IDが変更されます。永続要素の識別で新しい質問を開きました。

4

3 に答える 3

1

あなたの最善の策は、UI Automationを使用することです。

多くのアプリケーションがそれをサポートしていないため、これは完璧ではありません。

私のこの回答も見てください。同様の質問は、他のプロセススレッド/キューなどにアクセス/「アタッチ」できるようにするのに役立つかもしれません.

編集:(他の投稿にリンクするのを忘れていました。修正しました:)

于 2012-04-12T18:33:42.287 に答える
0

WCF、Webサービスは、プロセス間通信を容易にするためにあります。

于 2012-04-12T17:54:12.663 に答える
0

このManaged Spy ++のようなものを調べ ます

これは、C# のウィンドウの検索にも役立つ可能性があります

于 2012-04-12T18:15:03.790 に答える