如何使用Win32功能的VBA找到文本框的文本?

发布于 2025-01-25 07:55:55 字数 1189 浏览 4 评论 0原文

我正在尝试使用VBA从程序中获取文本。我正在使用Win32编程并捕获手柄,并尝试使用常数发送消息。我简化了我正在使用的代码,并将其放在下面。

我遇到麻烦的部分是WM_GetText消息。运行几秒钟后,该行代码崩溃了程序。

根据我的研究,ThunderRT6意味着目标程序是用VB 6制成的。

Private Declare PtrSafe Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Declare PtrSafe FindWindowEx Lib "user32.dll" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long

Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long

Private Const WM_GETTEXT As Long = &HD
Private Const WM_GETTEXTLENGTH As Long = &HE


Sub GetTextFromTextBox()
Dim hwnd As Long, myTxtBox As Long
  hwnd = FindWindow(vbNullString, "My Window")
  myTxtBox = FindWindowEx(hwnd, 0&, "ThunderRT6TextBox", vbNullString)

Dim myBuffer As String
Dim myPtr As Long
  myPtr = VarPtr(myBuffer)
Dim myLen As Long
  myLen = SendMessage(myTxtBox, WM_GETTEXTLENGTH, 0, ByVal 0&)
  Debug.Print SendMessage(myTxtBox, WM_GETTEXT, myLen, ByVal myPtr)
End Sub

I am trying to get the text from a textbox from a program using VBA. I am using Win32 programming and capturing the handles and trying to send messages using constants. I have simplified the code I am using and put it below.

The part I am having trouble with is with the WM_GETTEXT message. That line code crashes the program after a few seconds of being run.

Based on my research, ThunderRT6 means the target program was made with VB 6.

Private Declare PtrSafe Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Declare PtrSafe FindWindowEx Lib "user32.dll" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long

Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long

Private Const WM_GETTEXT As Long = &HD
Private Const WM_GETTEXTLENGTH As Long = &HE


Sub GetTextFromTextBox()
Dim hwnd As Long, myTxtBox As Long
  hwnd = FindWindow(vbNullString, "My Window")
  myTxtBox = FindWindowEx(hwnd, 0&, "ThunderRT6TextBox", vbNullString)

Dim myBuffer As String
Dim myPtr As Long
  myPtr = VarPtr(myBuffer)
Dim myLen As Long
  myLen = SendMessage(myTxtBox, WM_GETTEXTLENGTH, 0, ByVal 0&)
  Debug.Print SendMessage(myTxtBox, WM_GETTEXT, myLen, ByVal myPtr)
End Sub

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文