从另一个应用程序中读取列表框内容C#

时间:2012-05-28 08:48:26

标签: c# wpf .net-4.0

这个旧的stackoverflow post问我几乎相同的问题,但是使用Spy ++我已经获得了控件句柄ID。怎么办? :)

我不确定这个进程是什么,我可以从.net应用程序获取另一个应用程序控件的内容,因此我在旧的谷歌机器上的结果没有太大的成功。

我有一个带有列表框的MFC应用程序,其中包含使用WPF C#应用程序自动执行任务所需的数据。我宁愿不使用外部库,也不要认为一旦我找到这个过程并且我的C#应用​​程序可以看到相应的列表控件来完成我需要的工作,就不会太费力了。

任何人都可以指出我正确的方向,我应该查找什么或提供一些代码,让我开始。在这一点上,我被困住了,我的小项目非常依赖于此。我也不想使用OCR。

谢谢,

Ash

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

This question的回答应该让你开始。 Google P/InvokeFindWindow() / GetWindowText()系列方法。

希望有所帮助。