2014-06-12 2 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 

내가 실수를 저질렀습니까?

고지

답변

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은 문자열 버퍼입니다.

내 버전에서는 SendMessage()의 유니 코드 버전을 사용하여 크게 단순화했습니다. 즉, 반환 값 WindowText을 null 문자로 미리로드하고 API 호출과 함께이 함수를 직접 사용할 수 있습니다. StrPtr()은 VB 문자열과 관련된 유니 코드 버퍼에 대한 포인터를 반환합니다. API는이를 이해하고이 버퍼를 문제없이 사용합니다. VB6 문자열이 자동으로 null로 끝나는 것을 고려하여 SendMessage()를 호출 할 때 길이에 하나만 추가하면됩니다.

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 문으로 선언 된 변수는 코드가 실행되는 동안 해당 값을 유지합니다. – phd443322

+0

@ phd443322 변수가 아니라 "정적"으로 정의 된 클래스에 대해 실제로 생각하고있었습니다. –

+0

속성/메소드는 클래스에서 정적 일 수 있습니다. 속성 집합 문 개체에 대한 참조를 설정하는 속성 프로 시저의 본문을 구성하는 이름, 인수 및 코드를 선언합니다. 구문 [공개 | 비공개 | 친구] [정적] 속성 집합 이름 ([아글리스트,] 참조) [문] 슬프게도 [종료 속성] [문] 최종 속성 – phd443322

2

코드에 개체가 없습니다. 그러나 msgbox는 msgbox.show가 아닌 ​​msgbox입니다. 이것은 VB가 함수 (하위로 사용됨)가 아니라 객체라고 생각하도록 트릭합니다.

또한 서브의 경우 대괄호가 없습니다. 값을 반환하는 것만 대괄호가 필요합니다. 모든 기본 사항 중 vb.net에는 잠수정에 대괄호가 있습니다.

관련 문제