Консультация № 110119
19.11.2007, 11:57
0.00 руб.
0 2 2
Здравствуйте эксперты
вопрос такой как из VB симулировать нажатие клавиш на клавиатуре для управления другой программой

Обсуждение

давно
Профессионал
848
1596
19.11.2007, 20:16
общий
это ответ
Здравствуйте, Севрюков Евгений Валериевич!
Существует комманда SendKeys, которая посылает нажатие клавиши активному окну. Чтоб сделать окно активным есть команда AppActivate IDproc.
Для этого нам нужно знать ID процесса. Также вместо ID процесса можно указать заголовок окна приложения в виде строки.
Если мы сами запускаем прогу, то
=================
IDproc = Shell("C:\myproga.exe", vbNormalFocus)
AppActivate IDproc, True
SendKeys "z"
=================
Нажали клавишу Z :-)
Неизвестный
21.11.2007, 07:22
общий
это ответ
Здравствуйте, Севрюков Евгений Валериевич!
В принципе если после Shell сделать небольшую задержку, то и cmd окно получит фокус через AppActivate:

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
...
IDproc = Shell("cmd", vbNormalFocus)
Sleep 100
AppActivate IDproc, True
SendKeys "z"
...

но фокус ввода такая неустойчивая вещь, что в приложении вариант с непосредственной отправкой сообщений WM_CHAR окну приложения, не обязательно активному. GetWinHandle - взял из MSDN. Запуск - Sub t
Успехов.

Приложение:
Option ExplicitConst GW_HWNDNEXT = 2Const WM_CHAR = &H102Declare Function GetParent Lib "user32" (ByVal hWnd As Long) As LongDeclare Function GetWindow Lib "user32" (ByVal hWnd As Long, _ ByVal wCmd As Long) As LongDeclare Function FindWindow Lib "user32" Alias "FindWindowA" _ (ByVal lpClassName As String, ByVal lpWindowName As String) As LongDeclare Function GetWindowThreadProcessId Lib "user32" _ (ByVal hWnd As Long, lpdwprocessid As Long) As LongDeclare Function SendMessage Lib "user32" Alias "SendMessageA" _ (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long _ , lParam As Any) As LongDeclare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As LongFunction ProcIDFromWnd(ByVal hWnd As Long) As LongDim idProc As Long GetWindowThreadProcessId hWnd, idProc ProcIDFromWnd = idProcEnd Function Function GetWinHandle(hInstance As Long) As Long Dim tempHwnd As Long tempHwnd = FindWindow(vbNullString, vbNullString) Do Until tempHwnd = 0 If GetParent(tempHwnd) = 0 Then If hInstance = ProcIDFromWnd(tempHwnd) Then GetWinHandle = tempHwnd Exit Do End If End If tempHwnd = GetWindow(tempHwnd, GW_HWNDNEXT) LoopEnd FunctionSub SendChars(ByVal hWnd As Long, ByVal chars As String, Optional Delay As Byte = 1)Dim i As Integer For i = 1 To Len(chars) Call SendMessage(hWnd, WM_CHAR, CLng(Asc(Mid(chars, i, 1))), 0) Sleep Delay Next iEnd SubSub t()Dim hInst As LongDim hWnd As Long hInst = Shell("cmd", vbMinimizedNoFocus) Sleep 100 hWnd = GetWinHandle(hInst) If hWnd <> 0 Then SendChars hWnd, "dir" & vbCrLf SendChars hWnd, "This text is sending by messages to non focused window!" End If hInst = Shell("notepad", vbNormalFocus) Sleep 100 hWnd = GetWinHandle(hInst) If hWnd <> 0 Then hWnd = FindWindowEx(hWnd, 0, "Edit", vbNullString) SendChars hWnd, "This text is sending by messages!" & vbLf SendChars hWnd, "Remove Delay to prevent hand typing!", 100 End IfEnd Sub
Форма ответа