2014-06-12 56 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有子括號。

相關問題