如何在win32 API的帮助下使用VBA从另一个应用程序的列表框中获取文本和选择文本

如何在win32 API的帮助下使用VBA从另一个应用程序的列表框中获取文本和选择文本,vba,winapi,Vba,Winapi,我正在尝试使用VBA从另一个应用程序中的列表框中获取文本,这样,如果文本匹配,我就可以在列表框中选择特定选项。我有以下代码不起作用。每次我运行代码时,应用程序都会崩溃。我试图在谷歌上搜索解决方案,但运气不好。如果有人有任何解决办法,请帮助 Do DoEvents vendor_listbox = FindWindowEx(Client_window, 0&, "ListBox", vbNullString) Loop Until vendor_listbox > 0

我正在尝试使用VBA从另一个应用程序中的列表框中获取文本,这样,如果文本匹配,我就可以在列表框中选择特定选项。我有以下代码不起作用。每次我运行代码时,应用程序都会崩溃。我试图在谷歌上搜索解决方案,但运气不好。如果有人有任何解决办法,请帮助

Do
    DoEvents
    vendor_listbox = FindWindowEx(Client_window, 0&, "ListBox", vbNullString)
Loop Until vendor_listbox > 0
numberofindex = SendMessage(vendor_listbox, LB_GETCOUNT, 0, ByVal 0&)
TopIndex = SendMessage(vendor_listbox, LB_GETTOPINDEX, 0, 0)

For i = TopIndex To numberofindex - 1
    textcount = SendMessage(vendor_listbox, LB_GETTEXTLEN, i, 0)
    buffer$ = Space$(textcount + 1)
    Call SendMessage(vendor_listbox, LB_GETTEXT, i, buffer$)
    Debug.Print buffer$
    'This code does not work
    Call SendMessage(vendor_listbox,LB_SETCURSEL,i, 0&)
    'I have tried this too, but also didn't work
    Call SendMessage(vendor_listbox,LB_SELECTSTRING,0&, ByVal buffer$
    Call SendMessage(vendor_listbox,BM_CLICK, 0, ByVal 0&)
Next i
纠正这个

Do
    DoEvents
    vendor_listbox = FindWindowEx(Client_window, 0&, "ListBox", vbNullString)
Loop Until vendor_listbox > 0
numberofindex = SendMessage(vendor_listbox, LB_GETCOUNT, 0, ByVal 0&)
TopIndex = SendMessage(vendor_listbox, LB_GETTOPINDEX, 0, 0)

For i = TopIndex To numberofindex - 1
    textcount = SendMessage(vendor_listbox, LB_GETTEXTLEN, i, 0)
   'space for null terminating string '\0' will be automatically added by VB
    buffer$ = Space$(textcount ) 
    ' pass string byval not byref 
    ' also make sure that lParam of SendMessage is declared as ANY
    Call SendMessage(vendor_listbox, LB_GETTEXT, i, byval buffer$)
    Debug.Print buffer$
Next i

对于像我一样有同样问题的人,这里是我的解决方案,选择并将选择作为输入发送到程序。我试图避免使用sendkeys,但找不到解决方案

Call SendMessage(vendor_listbox, LB_SETSEL, ByVal 0&, ByVal -1&)
Call SendMessage(vendor_listbox, LB_SETSEL, ByVal 1&, ByVal 5&)
BringWindowToTop hinv_window
Application.SendKeys "{UP}", True
Application.SendKeys "{DOWN}", True
Application.SendKeys "{ENTER}", True

使用UI自动化不是很简单吗?@DavidHeffernan,我听说过很多关于UI自动化的事情。但没有人举过一个例子。@milevyowebsearchone@DavidHeffernan,我引用“使用UI自动化不是很简单吗?”如果UI自动化比OP给定的代码简单,那么给出一个示例也很容易。为什么websearch搜索会使事情复杂化?至少给出一个链接。@milevyo我个人认为websearch没有那么复杂。我已经尝试了另一个步骤来选择列表框中的项目,但似乎没有任何效果。我添加了以下代码来选择eatch项目,并将sendmessage添加到Ok按钮。Call SendMessage(vendor_listbox,LB_SELECTSTRING,0,ByVal buffer$)Call SendMessage(vendor_listbox,BM_CLICK,0&,ByVal 0&)应用程序。等待(Now()+TimeValue(“00:00:03”)@BunrithHeng我不清楚您想要什么,您可以随时重新编辑您的帖子,我想在另一个应用程序的列表框中选择一个选项,并通过单击该应用程序窗口中的“确定”按钮将其作为输入发送。我试过使用下面的代码。Call SendMessage(vendor_listbox,LB_SELECTSTRING,0,ByVal buffer$)和我也尝试了Call SendMessage(vendor_listbox,LB_SETCURSEL,I,ByVal 0&)。代码没有将选择发送到列表框。