2016-11-23 4 views
0

Следующий код возвращает "Run-Time Error 5: Неправильный вызов процедуры или аргумент" в строке:Недопустимый вызов процедуры или аргумент (ошибка 5) при вызове User32 PostMessage

результат = PostMessage (ч, WM_CHAR, Asc (Mid $ (vbCr, я, 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 для всех модулей ...), поэтому он пытается прочитать Mid$ с позиции 0. Это 1, поэтому ваша ошибка.

При этом неясно, почему вы пытаетесь извлечь 1 символ из 1-символьного символа. Asc(Mid$(vbCr, i, 1)) - это то же самое, что и Asc(vbCr), то есть всегда13. Просто используйте это:

result = PostMessage(h, WM_CHAR, 13&, 0&) 

Обратите внимание, что это не соответствует вашему комментарию на «отправить„calc.exe“с последующим возвращением провозного» на всех. Чтобы сделать это с сообщениями WM_CHAR, вам необходимо опубликовать все отдельные символы. Просто пропустите Asc и Mid$ полностью путем обработки строки в виде массива байтов:

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

Смежные вопросы