2014-06-12 54 views
1

我尝试从另一个应用程序(例如记事本或写字板)读取文本。 我必须这样做,在VB 6巫婆我没有编程,但我不能使用其他语言。从另一个应用程序的文本框中读取文本

我发现代码Vb.Net,我修改了它的VB 6,但我总是得到错误:“运行时错误‘424’:所需的对象”

代码是:

 Const WM_GETTEXTLENGTH = &HE 
    Const WM_GETTEXT = &HD 
Private Declare Function FindWindow Lib "USER32" Alias "FindWindowA" (_ 
    ByVal lpClassName As String, _ 
    ByVal lpWindowName As String _ 
) As Long 

Private Declare Function FindWindowEx Lib "USER32" Alias "FindWindowExA" (_ 
    ByVal hWndParent As Long, _ 
    ByVal hWndChildAfter As Long, _ 
    ByVal lpszClassName As String, _ 
    ByVal lpszWindowName As String _ 
) As Long 
Private Declare Function GetWindowText Lib "USER32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long 
Private Declare Function GetWindowTextLength Lib "USER32" Alias "GetWindowTextLengthA" (ByVal hWnd As Long) As Long 
Private Declare Function SendMessage Lib "USER32" Alias "SendMessageA" (_ 
    ByVal hWnd As Long, ByVal Msg As Long, _ 
    wParam As Any, lParam As Any) As Long 





Private Sub Command1_Click() 
     Dim notepadHandle As Long 
     notepadHandle = FindWindow("Notepad", vbNullString) 
     Dim childhandle As Long 
     childhandle = FindWindowEx(notepadHandle, 0, "Edit", vbNullString) 
     If notepadHandle = 0 Then 
      MessageBox.Show ("can't find") 
     Else 
      'MessageBox.Show (CStr(childhandle)) 
      ' MessageBox.Show (WindowText(childhandle)) 
       MessageBox.Show (WindowText(childhandle)) 
End If 

    End Sub 

    Public Function WindowText(ByVal window_hwnd As Long) As String 
     Dim txtlen As Integer 
     WindowText = "" 
     If window_hwnd = 0 Then Exit Function 
     txtlen = SendMessage(window_hwnd, WM_GETTEXTLENGTH, 0, _ 
      0) 
     If txtlen = 0 Then Exit Function 
     txtlen = txtlen + 1 
     Dim txt As String 
     txt = String(txtlen + 1, Chr$(0)) 
     txt = Convert.ToString(SendMessage(window_hwnd, WM_GETTEXT, txtlen, txt)) 

     WindowText = Convert.ToString(txt) 

    End Function 

我在哪里犯错?

Thanx

回答

2

不要指望VB.NET示例在VB6中工作。这两种语言在多个层次上是不兼容的,这不仅仅是因为VB6不使用.NET框架。语法也略有不同。

首先在风格上,VB中的声明通常位于过程的顶部。这是因为VB范围规则是按照过程完成的,并忽略了代码中的所有块。

VB6实际上并没有静态对象,尽管你可以用“全局”对象来伪装它,它会在你第一次尝试绑定时自动实例化一个公共(即来自外部组件)多用途类到它。

VB6消息框命令只是MsgBox()Convert.ToString只是CStr(),虽然VB往往会自动转换为字符串时,需要你不必做任何工作。

在任何情况下,线::

txt = Convert.ToString(SendMessage(window_hwnd, WM_GETTEXT, txtlen, txt)) 

...是错误的比转换的更多。 SendMessage()API调用返回一个Long值,而不是一个字符串。在这种情况下,txt是字符串缓冲区。

在我的版本中,我通过使用Unicode版本的SendMessage()大大简化了此操作。这意味着我可以简单地使用空字符预加载返回值WindowText,并直接使用API​​调用。 StrPtr()返回一个指向与VB字符串相关的Unicode缓冲区的指针。 API理解这一点,并且使用这个缓冲区没有问题。在调用SendMessage()时,我只需要添加一个,以便它考虑到VB6字符串会自动以null结尾。

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

Private Declare Function FindWindow Lib "USER32" Alias "FindWindowA" (_ 
    ByVal lpClassName As String, _ 
    ByVal lpWindowName As String _ 
) As Long 

Private Declare Function FindWindowEx Lib "USER32" Alias "FindWindowExA" (_ 
    ByVal hWndParent As Long, _ 
    ByVal hWndChildAfter As Long, _ 
    ByVal lpszClassName As String, _ 
    ByVal lpszWindowName As String _ 
) As Long 

Private Declare Function SendMessage Lib "USER32" Alias "SendMessageW" (_ 
    ByVal hWnd As Long, ByVal Msg As Long, ByRef wParam As Any, ByRef lParam As Any _ 
) As Long 

Private Sub Command1_Click() 

    Dim notepadHandle   As Long 
    Dim childhandle    As Long 

    notepadHandle = FindWindow("Notepad", vbNullString) 
    childhandle = FindWindowEx(notepadHandle, 0, "Edit", vbNullString) 

    If notepadHandle = 0 Then 
     MessageBox.Show "can't find" 
    Else 
     MsgBox WindowText(childhandle) 
    End If 

End Sub 

Public Function WindowText(ByVal window_hwnd As Long) As String 

    Dim txtlen    As Long 

    If window_hwnd = 0 Then 
     Exit Function 
    End If 

    txtlen = SendMessage(window_hwnd, WM_GETTEXTLENGTH, ByVal 0, ByVal 0) 
    If txtlen = 0 Then 
     Exit Function 
    End If 

    WindowText = String$(txtlen, vbNullChar) 
    SendMessage window_hwnd, WM_GETTEXT, ByVal (txtlen + 1), ByVal StrPtr(WindowText) 

End Function 
+0

我的vb6有静态变量。和静态程序。 Static Statement 用于过程级声明变量并分配存储空间。只要代码正在运行,用Static语句声明的变量就会保留它们的值。 – phd443322

+0

@ phd443322我真的在考虑将类定义为“静态”,而不是变量。 –

+0

属性/方法在类中可以是静态的。 Property Set Statement 声明形成Property过程的主体的名称,参数和代码,该过程设置对对象的引用。 语法 [公众|私人|朋友] [静态]属性设置名称([arglist中,参考) [声明] [退出房产] [声明] 高端物业 – phd443322

2

在代码中没有任何对象。不过msgbox只是msgbox而不是msgbox.show。这诱使VB认为它是一个对象而不是一个函数(被用作一个子函数)。

另外,因为它是一个子没有括号。只有返回值的东西需要括号。在所有的基础知识中,只有vb.net有子括号。

相关问题