【问题标题】:Read listbox content of from another application C#从另一个应用程序 C# 读取列表框内容
【发布时间】:2012-05-28 08:48:25
【问题描述】:

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

我不确定这个过程叫什么,我可以从 .net 应用程序获取另一个应用程序控件的内容,因此我在旧的 google 机器上的结果并不成功。

我有一个带有列表框的 MFC 应用程序,其中包含使用 WPF C# 应用程序自动执行任务所需的数据。我宁愿不使用外部库,并且一旦我找到该过程并让我的 C# 应用程序查看相应的列表控件来执行我需要的操作,我不认为它会太费力。

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

谢谢,

【问题讨论】:

    标签: c# wpf .net-4.0


    【解决方案1】:

    要从 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;
    }
    

    【讨论】:

      【解决方案2】:

      This question 的回答应该可以帮助您入门。 Google P/InvokeFindWindow() / GetWindowText() 系列方法。

      希望对您有所帮助。

      【讨论】:

      • 谢谢,不胜感激。
      • 虽然这是一个公平的答案,提示如何从 win32 控件获取文本,但在这种情况下(列表框)它将不起作用,GetWindowText 将返回空字符串
      • @Antonio 这就是为什么我小心使用“谷歌”这个词
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多