Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Эмуляция нажатия Добавлено: 26.03.04 17:14  

Автор вопроса:  Chill | ICQ: 554200 

По-моему такой вопрос уже обсуждался, но я так и не смог его найти на форуме...

Вопрос:

как сэмулировать нажатие ХОТКЕЯ или клавиши в другом приложении? Причем с помошью АПИ...

Ответить

  Ответы Всего ответов: 6  

Номер ответа: 1
Автор ответа:
 dNW



Вопросов: 30
Ответов: 683
 Профиль | | #1 Добавлено: 26.03.04 18:19

Private Declare Sub keybd_event Lib "user32" Alias "keybd_event" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

 

Я сам не пробовал, но думаю эта функция - то что надо.

У нее много констант. Открой API text viewer -> загрузи Win32API.txt и в комбобоксе выбери Constants. Там будут константы, начинающиеся с vk вроде

 Private Const VK_CONTROL = &H11

Ответить

Номер ответа: 2
Автор ответа:
 Chill



ICQ: 554200 

Вопросов: 101
Ответов: 343
 Профиль | | #2 Добавлено: 27.03.04 02:25

К сожалению это работает только для своего приложения, а мне надо сэмулировать нажатие в чужом приложении...

Ответить

Номер ответа: 3
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #3
Добавлено: 27.03.04 10:00

2Chill - все нормально и для др. приложений!!!

Вот то что я делал (без деклараций)

    ' Пoсылка клавиши
Public Function SendKey(ByVal hWnd As Long, _
ByVal bChar As Byte, _
Optional ByVal Shift As ShiftConstants) As Long
Dim OldWnd As Long

 

If hWnd = &HFFFF Then SendKey = &HFFFF: Exit Function

 

If Not hWnd = &H0 Then ' Сначала делаем активным нужное окошко
OldWnd = GetForegroundWindow()
SendKey = SetForegroundWindow(hWnd)
Call Sleep(500)
End If
' Далее нажимаем на кнопки
If (Shift And vbAltMask) = vbAltMask Then Call keybd_event(&HA4, &H45, &H1 Or &H0, &H0)
If (Shift And vbCtrlMask) = vbCtrlMask Then Call keybd_event(&HA2, &H45, &H1 Or &H0, &H0)
If (Shift And vbShiftMask) = vbShiftMask Then Call keybd_event(&HA0, &H45, &H1 Or &H0, &H0)

 

If Not SendKey = &H0 Then ' Отсылаем клавишу
Call keybd_event(bChar, &H45, &H1 Or &H0, &H0)
Call keybd_event(bChar, &H45, &H1 Or &H2, &H0)
End If
' Восстанавливаем былые значения кнопок
If Shift And vbAltMask = Shift Then Call keybd_event(&HA4, &H45, &H1 Or &H2, &H0)
If Shift And vbCtrlMask = Shift Then Call keybd_event(&HA2, &H45, &H1 Or &H2, &H0)
If Shift And vbShiftMask = Shift Then Call keybd_event(&HA0, &H45, &H1 Or &H2, &H0)

 

Call SetForegroundWindow(OldWnd)
End Function

Ответить

Номер ответа: 4
Автор ответа:
 dem



Вопросов: 3
Ответов: 20
 Профиль | | #4 Добавлено: 27.03.04 17:12
2sne. Спасибо, это как раз то, что мне нужно было. Только там, кажется,
опечатка. Вместо

Shift And vbAltMask = Shift
Shift And vbCtrlMask = Shift
Shift And vbShiftMask = Shift

должно быть

(Shift And vbAltMask) = vbAltMask
(Shift And vbCtrlMask) = vbCtrlMask
(Shift And vbShiftMask) = vbShiftMask

Вообще, после выполнения процедуры могут отжаться некоторые нажатые кнопки.
Ну и ладно, в крайнем случае можно запомнить их по GetKeyState.

Ответить

Номер ответа: 5
Автор ответа:
 Chill



ICQ: 554200 

Вопросов: 101
Ответов: 343
 Профиль | | #5 Добавлено: 29.03.04 17:18

' Сначала делаем активным нужное окошко

Вот это-то меня и не устраивает... окно вообще не должно быть видимым, а действие надо передать...

Ответить

Номер ответа: 6
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #6
Добавлено: 29.03.04 21:09

Хи, я тоже бился с этой проблеммой... Даже эмулировал нажатия (SendMessage'ем) сначала WM_KEYDOWN, потом WM_CHAR и WM_KEYUP, но ничего не получалось, точнее где-то получалось, а где-то нет... В конце концов меня все закалебало и я решил прибегнуть к способу, который использует программа uICE, ее же не дураки писали, видать тоже этим вопросом задавались... В итоге получилось то что есть (см. выше)... Если кто найдет вариант, или у кого идея зародится, подскажите... может и сделаем общими силами :)

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам