Помогите с Sendmessage

  • Автор темы zzzaaazzz
  • Дата начала
Z

zzzaaazzz

#1
Добрый день.
Необходимо имитировать нажатие клавиш в другом приложении(не активном). Что только не пробывал. В обычное текстовое поле блокнота успешно получается. Ниже код

Код:
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As String, ByVal lParam As String) As Integer

Private Const WM_CHAR As Integer = &H102
Private Const WM_DEADCHAR As Integer = &H103
Private Const WM_KEYUP As Integer = &H101
Private Const WM_KEYDOWN As Integer = &H100
Private Const WM_COMMAND As Integer = &H111

hwnd = FindWindow(vbNullString, TextBox1.Text)

SendMessage(hwnd, WM_CHAR, "1", 0)
Что только не пробывал, всеравно не хочет, мб упускаю какую нибудь мелочь, подскажите плиииззз :)
 

Nadja

New member
14.02.2017
1
0
#2
Аналогично. Чуть не месяц просидела за компом в поисках ответа: ну почему, ну почему? Уж каких только советов не применяла, каких функций из разных библиотек не пробовала - не растет кокос.
И вот, уже совсем отчаявшись, наткнулась на фразочку одного удачливого собрата по несчастью. Он написал всего несколько строчек, в которых ОНО у него заработало. Секрет оказался в том, что нужно, во-первых, использовать не просто константу, например, для клавиши "F5" как VK_F5, но рядышком в той же строке для вызова функции надо поставить через запятую, эту же константу, но в обработке функции MapVirtualKey(), ну и соблюсти до математической точности положение всех скобочек, запятых и ноликов.
Пример счастливчик привел не для SendMessage, а для PostMessage, но это не принципиально. Я вместо SendMessage тоже воспользовалась PostMessage.
Пример для отправки в другое приложение с неактивным окном клавиши F5 будет выглядеть так:

Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, _
ByVal wMsg As Long, ByVal wParam As Long, lParam As Long) As Long
Private Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long

Private Const VK_F5 = &H74
Private Const WM_KEYDOWN = &H100
Private Const WM_KEYUP = &H101

Private Sub Шлю_тебе_клавишу_F5(ByVal HWND As Long)
PostMessage HWND, WM_KEYDOWN, VK_F5, MapVirtualKey(VK_F5, 0)
PostMessage HWND, WM_KEYUP, VK_F5, MapVirtualKey(VK_F5, 0)
End Sub