Логотип
Главная 
Практика 
Игры 
Софт 
Ссылки 
Анекдоты 
Баланс звука
ПРАКТИКА
Изменение баланса
Предыдущая тема  |  Практика. Тема 14  |  Следующая тема

Эмуляция. Нажатие клавиш.

         Эмулировать или синтезировать нажатие клавиши, кнопки, движение мыши в каком-либо окне приложения можно разными способами! Их существует 3. Это функция SendInput, процедуры SendKeys и keybd_event. Попробуем все три способа, сравним, сделаем выводы.

         Откройте новый стандартный проект, разместите на форме кнопку CommandButton с именем Command1, с Caption, равным keybd_event, вторую кнопку Command2 с Caption, равным SendInput, третью кнопку Command3 с Caption, равным SendKeys. Теперь поместите код в модуль формы. Внимательно прочтите комментарии к коду:

'--- keybd_event:
Private Declare Sub keybd_event Lib "user32" _
(ByVal bVk As Byte, ByVal bScan As Byte, _
ByVal dwFlags As Long, ByVal dwExtraInfo As Long)


'константы для клавиш мыши (в этом примере не используются):
Private Const VK_LBUTTON = &H1
Private Const VK_RBUTTON = &H2


'константы некоторых клавиш:
Private Const VK_SHIFT = &H10
Private Const VK_NUMLOCK = &H90
Private Const VK_CAPITAL = &H14
Private Const VK_SCROLL = &H91


'--- SendInput:
Private Declare Function SendInput Lib "user32.dll" _
(ByVal nInputs As Long, pInputs As GENERALINPUT, _
ByVal cbSize As Long) As Long

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(pDst As Any, pSrc As Any, ByVal ByteLen As Long)


'константы для ввода событий от мыши, клавиатуры, оборудования:
Private Const INPUT_MOUSE = 0
Private Const INPUT_KEYBOARD = 1
Private Const INPUT_HARDWARE = 2

Private Type KEYBDINPUT
'тип для клавиатуры
      wVk As Integer
      wScan As Integer
      dwFlags As Long
      time As Long
      dwExtraInfo As Long
End Type

Private Type MOUSEINPUT
'тип для мыши
      dx As Long
      dy As Long
      mouseData As Long
      dwFlags As Long
      time As Long
      dwExtraInfo As Long
End Type

Private Type HARDWAREINPUT
'тип для оборудования
      uMsg As Long
      wParamL As Integer
      wParamH As Integer
End Type

Private Type GENERALINPUT
      dwType As Long
      xi(0 To 23) As Byte
End Type


'--- Общие константы:
Const KEYEVENTF_KEYUP = &H2 'отпускания клавиши
Const VK_У = 69 'для написания слова
Const VK_Р = 72
Const VK_А = 70

Private Sub Command1_Click()

'''ОБРАБОТКА СОБЫТИЯ НАЖАТИЯ КНОПКИ 1'''
'1. keybd_event является процедурой Win32 API, но не функцией, _
поэтому никаких значений она не возвращает, позволяет эмулировать _
нажатие клавиш, кнопок мыши, делать захват изображения рабочего _
стола, активного окна
'2. Раскладка клавиатуры окна влияет на текст (если в окне стоит _
английская раскладка, то "УРА" поменяется на "EHF"
'3. Регистр букв зависит от состояния "CapsLock" в окне
'4. На нажатие-отпускание каждой клавиши нужно 2 строки кода

       keybd_event VK_NUMLOCK, 0, 0, 0 'нажимаем "Num Lock"
       keybd_event VK_NUMLOCK, 0, KEYEVENTF_KEYUP, 0 'отпускаем
       'keybd_event VK_CAPITAL, 0, KEYEVENTF_EXTENDEDKEY, 0 'нажимаем "Caps Lock"
       'keybd_event VK_CAPITAL, 0, KEYEVENTF_KEYUP, 0 'отпускаем

       keybd_event VK_SCROLL, 0, 0, 0 'нажимаем "Scroll Lock"
       keybd_event VK_SCROLL, 0, KEYEVENTF_KEYUP, 0 'отпускаем
       'вызовем блокнот для записи нажатых клавиш:
       Shell "Notepad", vbNormalFocus
       keybd_event VK_SHIFT, 0, 0, 0
'нажимаем "Shift"
       keybd_event VK_У, 0, 0, 0 'нажимаем "У"
       keybd_event VK_У, 0, KEYEVENTF_KEYUP, 0 'отпускаем "У"
       keybd_event VK_SHIFT, 0, KEYEVENTF_KEYUP, 0 'отпускаем "Shift"
       keybd_event VK_Р, 0, 0, 0 'нажимаем "Р"
       keybd_event VK_Р, 0, KEYEVENTF_KEYUP, 0 'отпускаем "Р"
       keybd_event VK_А, 0, 0, 0 'нажимаем "А"
       keybd_event VK_А, 0, KEYEVENTF_KEYUP, 0 'отпускаем "А"
End Sub

Private Sub Command2_Click()

'''ОБРАБОТКА СОБЫТИЯ НАЖАТИЯ КНОПКИ 2'''
'1. SendInput является функцией Win32 API, синтезирующей нажатие _
клавиш, движение мыши, нажатие кнопок
'2. Раскладка клавиатуры окна влияет на текст (если в окне стоит _
английская раскладка, то "УРА" поменяется на "EHF"
'3. Регистр букв зависит от состояния "CapsLock" в окне
'4. На нажатие каждой клавиши нужно 2 строки кода, некоторые _
клавиши просто необходимо затем отпускать

       Dim sost(0 To 1) As GENERALINPUT 'переменная состояния (2 - нажатие-отжатие)
       Dim inp As KEYBDINPUT 'переменная использования событий клавиатуры
       'вызовем блокнот для записи нажатых клавиш:

       Shell "Notepad", vbNormalFocus
       sost(0).dwType = INPUT_KEYBOARD
'1-е состояние брать от клаватуры
       sost(1).dwType = INPUT_KEYBOARD '2-е состояние брать от клавиатуры
       inp.dwFlags = KEYEVENTF_KEYUP
       'нажать "Shift":
       sost(0).xi(0) = VK_SHIFT
       SendInput 1, sost(0), Len(sost(0))

       'нажать "У":
       sost(0).xi(0) = VK_У
       SendInput 1, sost(0), Len(sost(0))

       'отпустить "Shift":
       inp.wVk = VK_SHIFT
       CopyMemory sost(1).xi(0), inp, Len(inp)
       SendInput 2, sost(0), Len(sost(0))

       'Эмуляция нажатия букв "Р" и "А" может быть сделана и с _
       последующим отжатием, и без него, но желательно всегда отжимать клавиши:
       'нажать "Р" (с последующим отжатием):

       sost(0).xi(0) = VK_Р
       inp.wVk = VK_Р
       CopyMemory sost(1).xi(0), inp, Len(inp)
       SendInput 2, sost(0), Len(sost(0))

       'нажать "А" (без отжатия):
       sost(0).xi(0) = VK_А
       SendInput 1, sost(0), Len(sost(0))
End Sub

Private Sub Command3_Click()

'''ОБРАБОТКА СОБЫТИЯ НАЖАТИЯ КНОПКИ 3'''
'1. Процедура встроена в Visual Basic
'2. Раскладка клавиатуры окна влияет на текст (если в окне стоит _
английская раскладка, то "УРА" поменяется на "EHF"
'3. Регистр букв будет таким, каким Вы его укажете
'4. Длина кода сокращается за счёт возможности писать одну _
команду для эмуляции ряда нажатий клавиш
       'вызовем блокнот для записи нажатых клавиш:

       Shell "Notepad", vbNormalFocus
       'запишем любое сочетание нажатий клавиш в кавычках
       SendKeys "Ур{а 3}+{LEFT 5}^c{RIGHT 5}{ENTER}^v", True
End Sub


         Можете попробовать все три способа эмуляции написания слова "Ура" на страничке Блокнота, вызываемого программой, запустив программу на выполнение (Run).

         Выводы:
1. для эмуляции нажатия клавиш и кнопок мыши keybd_event крайне неудобна. Её возможность захвата изображения не компенсирует недостатки - для этого удобнее другие функции (GetDC и так далее). Процедура считается устаревшей и её использование целесообразно лишь при переключении замков (Num, Caps, Scroll)
2. SendInput страдает теми же недостатками, но её возможности расширены возможностью имитировать движение мыши, эмулировать сообщения от иного оборудования
3. SendKeys наиболее удобна для эмуляции нажатий клавиш и кнопок мыши. Её недостаток - снижение скорости передачи в чужое окно длинных строк.

Предыдущая тема  |  Практика. Тема 14  |  Следующая тема

alexansol@mail.ru

продажа женские подарки на 14 февраля отзывы  |  Купить копии часов цена швейцарские наручные часы