Тема: Как с помощью функции SendMessage послать нажатие клавиши в другое приложение?
Помогите с помощью функции WIN32API SendMessage послать нажатие клавиши в другое приложение.
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → VBA → Как с помощью функции SendMessage послать нажатие клавиши в другое приложение?
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Помогите с помощью функции WIN32API SendMessage послать нажатие клавиши в другое приложение.
Нажатие клавиш эмулируется ф-цией VB - sendkeys
Держи:
Запускаем NotePad и пишем в него, что хотим
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As Long) 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 Const MAX_PATH = 255
Sub write_to_NotePad()
Shell "notepad.exe", 1 ' Çàïóñêàåì Notepad
Dim sTitle As String
Dim I As Integer
Dim hWnd As Long
hWnd = FindWindow("Notepad", 0)
sTitle = Space$(MAX_PATH)
hWnd = FindWindow("Notepad", 0)
Call GetWindowText(hWnd, sTitle, MAX_PATH)
sTitle = TrimNull(sTitle)
AppActivate sTitle
SendKeys "Ïèøåì â NotePad, ÷òî õîòèì" & Chr(13) & Chr(10) & "Åùå ïèøåì" & Chr(13) & Chr(10) & "È åùå ïèøåì", True '& Chr(10), 1 ' Ïîñûëàåì ñòðî÷êè â îòêðûòûé ôàéë Notepada
End Sub
Private Function TrimNull(item As String)
'remove string before the terminating null(s)
Dim pos As Integer
pos = InStr(item, Chr$(0))
If pos Then
TrimNull = Left$(item, pos - 1)
Else: TrimNull = item
End If
End Function
Private Sub Command1_Click()
write_to_NotePad
End Sub
Dim ОтветПрограммы As Variant
Dim RetVal
Dim HandleProgram As Long
RetVal = Shell(cPrompt, vbMinimizedFocus)
MsgBox RetVal
HandleProgram = FindWindow(vbNullString, cPrompt)
RetVal = SendMessage(HandleProgram, "2", 0, 0)
RetVal = SendMessage(HandleProgram, "{ENTER}", 0, 0)
RetVal = SendMessage(HandleProgram, "3", 0, 0)
RetVal = SendMessage(HandleProgram, "{ENTER}", 0, 0)
RetVal = SendMessage(HandleProgram, "4", 0, 0)
RetVal = SendMessage(HandleProgram, "{ENTER}", 0, 0)
' If N_prg = 2 Then
' Application.Wait (Now + TimeValue("0:00:3"))
' VBA.SendKeys "2", True
' VBA.SendKeys "{ENTER}", True
' VBA.SendKeys "3", True
' VBA.SendKeys "{ENTER}", True
' VBA.SendKeys "4", True
' VBA.SendKeys "{ENTER}", True
' End If
Сначала пробовал VBA функцию SendMessage и кое-что получалось, но не то что надо: в окне программы какбуд-то в текстовом редакторе 6 раз появлялся символ "\" и курсор перемещался на следующую строку, т.е. получался столбец из этого символа. А должно было быть: название файла - 2, затем "Enter", название файла - 3, "Enter" и т.д. и если не правильно введено название файла, то после нажатия "Enter" программа снова выводит запрос на указание имени файла, а у меня после применения SendKeys никакой работы и никаких запросов.
Функция FindWindow возвращает Handel окна программы, однако SendMessage не работает. Наверное надо разобраться с параметрами этой функции: второму параметру наверное надо присвоить значение WM_KEYDOWN, а в дополнительных 3 и (4) параметрах указать название клавиши (и клавиатуру на которой эта клавиша вроде бы как нажимается). Но как это сделать, а именно сначала надо понять как описать параметр WM_KEYDOWN и вообще есть ли такая константа. Вот константа WM_BUTTONDOWN есть, сам видел, но снажатием кнопки окна проще, там просто указывается Handel этой кнопки и программе ясно какую кнопку надо нажимать, а вот с клавишей непонятно как программе обяснить нажатие какой клавиши требуется эмулировать. Может специалисты объяснят?
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → VBA → Как с помощью функции SendMessage послать нажатие клавиши в другое приложение?
Форум работает на PunBB, при поддержке Informer Technologies, Inc