如何在c#中使用user32.dll从类“ThunderRT6ListBox”的窗口中检索值

我试图从Windows中的extern桌面应用程序检索信息。

我知道如何从Textboxes中提取文本(类“编辑”),但我不知道如何从类名为“ThunderRT6ListBox”和“ThunderRT6ComboBox”的控件中提取值。 我怎样才能做到这一点?

我有这段代码从文本框中提取文本:

public static class ModApi { [DllImport("user32.dll", EntryPoint = "FindWindowA", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)] public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] public static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount); [DllImport("user32.dll", EntryPoint = "SendMessageTimeout", SetLastError = true, CharSet = CharSet.Auto)] public static extern uint SendMessageTimeoutText(IntPtr hWnd, int Msg, int countOfChars, StringBuilder text, uint flags, uint uTImeoutj, uint result); [DllImport("user32.dll", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)] static internal extern bool EnumChildWindows(IntPtr hWndParent, funcCallBackChild funcCallBack, IntPtr lParam); [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; public static string GetText(IntPtr hwnd) { var text = new StringBuilder(1024); if (SendMessageTimeoutText(hwnd, 0xd, 1024, text, 0x2, 1000, 0) != 0) { return text.ToString(); } return ""; } } public foo() { IntPtr value = new IntPtr(0x019C086A); //ID locate using Spy++ String caption = ModApi.GetText(value); } 

更新1:

从ListBox读取的方法:

  public static List GetListBoxContents(IntPtr listBoxHwnd) { int cnt = (int)SendMessage(listBoxHwnd, LB_GETCOUNT, IntPtr.Zero, null); List listBoxContent = new List(); 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:

从ComboBox读取的方法:

  public static List GetComboBoxContents(IntPtr cbBoxHwnd) { int cnt = (int)SendMessage(cbBoxHwnd, CB_GETCOUNT, IntPtr.Zero, null); List listBoxContent = new List(); for (int i = 0; i < cnt; i++) { //int txtLength = SendMessage(cbBoxHwnd, CB_GETLBTEXTLEN, i, 0); StringBuilder sb = new StringBuilder(256); IntPtr getText = SendMessage(cbBoxHwnd, CB_GETLBTEXT, (IntPtr)i, sb); listBoxContent.Add(sb.ToString()); } return listBoxContent; } 

您正在从eons之前处理VB6应用程序。 “迅雷”是VB产品/项目的内部名称(简单的旁注)。

你比你意识到的更近。 如果你有HWND控件,我认为你这样做:

  1. 使用该HWND和消息LB_GETCOUNT调用SendMessage以获取列表中的项目数。
  2. 对于每个索引,使用LB_GETTEXTLEN调用SendMessage和当前项索引以获取文本的长度,然后相应地分配缓冲区。
  3. 再次调用SendMessage,这次使用LB_GETTEXT消息,相同的项索引(从零开始),以及对缓冲区的引用,这应该可以获得每个项目的文本。

您可能会再考虑一个SendMessage的声明/别名,它只返回一个int,这会使其中一些调用变得更简单。

如果我有机会,稍后我会用一个更具体的代码示例(或至少是伪代码)来清理它,但我得到的印象是你已经在正确的轨道上了,可能只需要这个基本描述得到剩下的路。

祝好运!