2016-11-23 9 views
0

를 다음 코드는 반환 호출 할 때 "런타임 오류 5 : 잘못된 프로 시저 호출 또는 인수가"잘못된 프로 시저 호출 또는 인수 (오류 5)가 User32 PostMessage를

결과 = PostMessage를 (시간, WM_CHAR, 오름차순 라인에서 (MID $ (vbCr, I, 1)), 0 &)

Private Const WM_CHAR = &H102 
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long 
Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long 

Sub PostToCmdLine() 
    Dim h As Long 
    Dim result As Boolean 
    ' find dos prompt window 
    h = FindWindow(vbNullString, "c:\windows\system32\cmd.exe") 
    Stop 
    If h Then 
     ' send "calc.exe" followed by carraige return 
     result = PostMessage(h, WM_CHAR, Asc(Mid$(vbCr, i, 1)), 0&) 
     ' optional, check postmessage result 
     If result = False Then MsgBox ("postmessage failed!") 
     'close the hidden dos prompt window 
     ' SendTxt(h, "exit" & vbCr) 
    Else 
     MsgBox ("dos prompt window not found") 
    End If 
End Sub 

내가 뭘 잘못하고 있는가?

답변

1

이도 PostMessage에 호출을 결코 - 오류가이 비트에 있습니다

Asc(Mid$(vbCr, i, 1)) 

변수 i 선언하거나 값을 할당 (및 모든 모듈에 Option Explicit를 추가하기위한 좋은 인수입니다 않습니다 ...) 그래서 그것은 위치 0에서 Mid$을 읽으려고합니다. 이것은 1 기반이므로 오류가 발생합니다.

즉, 왜 1 문자 길이의 리터럴에서 1 문자를 추출하려고하는지 명확하지 않습니다. Asc(Mid$(vbCr, i, 1))Asc(vbCr)과 같으며 항상 이고13입니다. 그냥 다음을 사용하십시오 :

"send"calc.exe "와"carraige return "의 코멘트가 일치하지 않음에 유의하십시오. WM_CHAR 메시지를 사용하려면 모든 개별 문자를 게시해야합니다. 그냥 바이트 배열로 문자열을 처리하여 완전히 AscMid$를 건너 :

Dim chars() As Byte 
chars = StrConv("calc.exe" & vbCr, vbFromUnicode) 
Dim i As Long 
For i = LBound(chars) To UBound(chars) 
    result = PostMessage(h, WM_CHAR, CLng(chars(i)), 0&) 
    'Check result to see if you need to bail here. 
Next 
+0

이 근무! 아주 철저한 대답에 감사드립니다. – Daniel