3

この古いスタック オーバーフローの投稿では、私とほぼ同じ質問をしていますが、Spy++ を使用してコントロール ハンドル ID を取得しました。それで?:)

.net アプリケーションから別のアプリケーション コントロールのコンテンツを取得できるこのプロセスが何と呼ばれているのかわかりません。そのため、古い Google マシンで結果を得ることができません。

WPF C# アプリケーションを使用してタスクを自動化するために必要なデータを含むリスト ボックスを持つ MFC アプリケーションがあります。私は外部ライブラリを使用しないことを好み、プロセスを見つけてC#アプリにそれぞれのリストコントロールを表示させて必要なことを実行させたら、それほど労力がかかるとは思いません。

私が何を調べるべきか、または私を始めるためのコードを提供してください。この時点で私は立ち往生しており、私の小さなプロジェクトはこれに大きく依存しています。OCRも使いたくありません。

ありがとう、

4

2 に答える 2

2

Win32 ListBox コントロールからテキストを取得するには、そのコントロール専用のメッセージと関数を使用する必要があります。参考文献は次のとおりです。

http://msdn.microsoft.com/en-us/library/windows/desktop/ff485971%28v=vs.85%29.aspx

あなたの場合、最初にリストボックスにあるアイテムの数を で確認しLB_GETCOUNT、次にアイテムごとに でテキストを取得する必要がありますLB_GETTEXT

リスト内のアイテムを返すメソッドは次のとおりです。パラメーターは ListBox コントロール ウィンドウ ハンドルです。

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, StringBuilder lParam); 
const int LB_GETCOUNT = 0x018B;
const int LB_GETTEXT = 0x0189;

private List<string> GetListBoxContents(IntPtr listBoxHwnd)
{
  int cnt = (int)SendMessage(listBoxHwnd, LB_GETCOUNT, IntPtr.Zero, null);
  List<string> listBoxContent = new List<string>();
  for (int i = 0; i < cnt; i++)
  {
    StringBuilder sb = new StringBuilder(256);
    IntPtr getText = SendMessage(listBoxHwnd, LB_GETTEXT, (IntPtr)i, sb);
    listBoxContent.Add(sb.ToString());
  }
  return listBoxContent;
}
于 2012-05-28T12:04:41.680 に答える
0

この質問の答えは、あなたを始めるはずです。GoogleP/InvokeおよびFindWindow()/GetWindowText()ファミリーのメソッド。

それが役立つことを願っています。

于 2012-05-28T09:50:21.483 に答える