как отловить нажатие клавиши вне формы таймером ?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
u3er
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 04.05.2013 (Сб) 21:50

как отловить нажатие клавиши вне формы таймером ?

Сообщение u3er » 25.05.2013 (Сб) 12:45

у меня был код я его потерял с keystate и async функцией помогите подалуйста самый простой и рабчий способ мне нужно клавишу win отловить

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: как отловить нажатие клавиши вне формы таймером ?

Сообщение ger_kar » 25.05.2013 (Сб) 14:20

Код: Выделить всё
Public Const VK_LWIN As Long = &H5B  '(91)
Public Const VK_RWIN As Long = &H5C '(92)

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
    Debug.Print KeyCode
End Sub


Левая клавиша код = 91
Правая клавиша код= 92
Бороться и искать, найти и перепрятать

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 25.05.2013 (Сб) 15:21

ger_kar, написано же "вне формы", зачем тут код с Form_KeyDown?

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: как отловить нажатие клавиши вне формы таймером ?

Сообщение ger_kar » 25.05.2013 (Сб) 16:07

А причем там таймер?
Если вне формы, то тогда надобно хук ставить
На форуме валом инфы на эту тему
Например здесь
Бороться и искать, найти и перепрятать

u3er
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 04.05.2013 (Сб) 21:50

Re: как отловить нажатие клавиши вне формы таймером ?

Сообщение u3er » 25.05.2013 (Сб) 17:23

ger_kar писал(а):А причем там таймер?
Если вне формы, то тогда надобно хук ставить
На форуме валом инфы на эту тему
Например здесь


Никакой там хук не нужен деларация asynckeystate и код типо if keystate 13 then у меня он был но я потерял самый простой а ты тут про хуки ненужные говоришь и в таймер ставил этот if и все работало даж модули не нужны и код в три строки вместе с декларацией писец ты а ты мне хуки всякие на страницу говришь просто не знаешь зачем мудрить когда есть работающий код в три строки Async keystate декларация была и все

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: как отловить нажатие клавиши вне формы таймером ?

Сообщение ger_kar » 25.05.2013 (Сб) 17:47

Ну если делать как попало то и asynckeystate пойдет, а если делать правильно и как положено, тогда хук.
И как раз здесь хук самое то.
Декларация
Код: Выделить всё
Declare Function GetAsyncKeyState Lib "USER32.DLL" (ByVal vKey As Long) As Integer

Коды виртуальных клавиш для Win я давал, если нужен полный список то смотри сюда
Используется так:
Код: Выделить всё
If GetAsyncKeyState(VK_LWIN) = -32768 Then MsgBox "Нажат левый Win"
If GetAsyncKeyState(VK_RWIN) = -32768 Then MsgBox "Нажат правый Win"

Это конечно упрощенный вариант. По идее надо не только отслеживать нажатие, но и отпускание клавиши. Так как полное нажатие это нажал/отпустил. И если брать меню которое открывается по Win, то оно как раз открывается после отпускания кнопки.
Бороться и искать, найти и перепрятать

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: как отловить нажатие клавиши вне формы таймером ?

Сообщение ger_kar » 25.05.2013 (Сб) 18:01

Кроме GetAsyncKeyState можно заюзать GetInputState, GetKeyboardState, GetKeyState

Декларации:
Код: Выделить всё
Public Declare Function GetInputState Lib "user32" () As Long
Public Declare Function GetKeyboardState Lib "user32" (pbKeyState As Byte) As Long
Public Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer


Справку по функциям можно посмотреть здесь: GetInputState, GetKeyboardState

В чём разница между GetKeyState и GetAsyncKeyState читать здесь
Бороться и искать, найти и перепрятать

u3er
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 04.05.2013 (Сб) 21:50

Re: как отловить нажатие клавиши вне формы таймером ?

Сообщение u3er » 25.05.2013 (Сб) 18:11

ger_kar писал(а):Кроме GetAsyncKeyState можно заюзать GetInputState, GetKeyboardState, GetKeyState

Декларации:
Код: Выделить всё
Public Declare Function GetInputState Lib "user32" () As Long
Public Declare Function GetKeyboardState Lib "user32" (pbKeyState As Byte) As Long
Public Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer


Справку по функциям можно посмотреть здесь: GetInputState, GetKeyboardState

В чём разница между GetKeyState и GetAsyncKeyState читать здесь



Private Declare Function GetAsyncKeystate Lib "user32" (ByVal vKey As Long) As Integer


Private Sub Timer1_Timer()
If GetAsyncKeystate(13) Then MsgBox "666"
End Su


у меня типо этого было но работа а ща пишет невозможно найти точку входа в lib user32
в чем ошибка помоги рожалуйста
если пишу GetAsyncKeystate = 13 then msdbox "123" то выделяет.желтым таймер и синим текст GetAsyncKeystate в таймере
Последний раз редактировалось u3er 25.05.2013 (Сб) 18:19, всего редактировалось 1 раз.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: как отловить нажатие клавиши вне формы таймером ?

Сообщение ger_kar » 25.05.2013 (Сб) 18:17

Надо просто все делать внимательно!
GetAsyncKeyState А не GetAsyncKeystate
Бороться и искать, найти и перепрятать

u3er
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 04.05.2013 (Сб) 21:50

Re: как отловить нажатие клавиши вне формы таймером ?

Сообщение u3er » 25.05.2013 (Сб) 18:26

ger_kar писал(а):Надо просто все делать внимательно!
GetAsyncKeyState А не GetAsyncKeystate

Спасибо не думал что все так чувствительно даже к регистру

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 25.05.2013 (Сб) 19:00

ger_kar писал(а):Ну если делать как попало то и asynckeystate пойдет, а если делать правильно и как положено, тогда хук.

Зачем хук, когда можно hotkey объявить просто?

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: как отловить нажатие клавиши вне формы таймером ?

Сообщение ger_kar » 25.05.2013 (Сб) 19:04

Qwertiy писал(а):Зачем хук, когда можно hotkey объявить просто?
Никогда не пользовался hotkey. Но это не самый надежный вариант, ибо могут быть конфликты. Хук ИМХО более надежная тема. Хотя конечно все зависит от задачи. А тут суть затеи не понятна.
Бороться и искать, найти и перепрятать

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: как отловить нажатие клавиши вне формы таймером ?

Сообщение arthur2 » 25.05.2013 (Сб) 23:12

Хуки на новых системах должны быть каким-то хитрым образом подписаны и прописаны - напарывался на эти грабли (каким - выяснить мне так и не удалось). Ни глобальные, ни даже журнальные хуки могут просто не работать за пределами своей программы.

Опрос по таймеру состояния клавиш - вполне нормальный вариант. Но GetAsyncKeyState не годится, поскольку, допустим, две одновременно запущенные программы, юзающие ...Async... , будут получать все нажатые клавиши, но по очереди - половину она, половину другая (в чём смысл такого поведения этой функции - мне не понятно, но поведение именно такое)
Артур
 
   

u3er
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 04.05.2013 (Сб) 21:50

Re: как отловить нажатие клавиши вне формы таймером ?

Сообщение u3er » 26.05.2013 (Вс) 0:13

люди а как сделать чтобы GetAsyncJeyState ловил и надатие клавиш а то он ток реагирует когда клавиша отжата уже а не нажата

u3er
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 04.05.2013 (Сб) 21:50

Re: как отловить нажатие клавиши вне формы таймером ?

Сообщение u3er » 26.05.2013 (Вс) 0:14

люди а как сделать чтобы GetAsyncKeyState ловил и нажатие клавиш а то он ток реагирует когда клавиша отжата уже а не нажата

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: как отловить нажатие клавиши вне формы таймером ?

Сообщение arthur2 » 26.05.2013 (Вс) 7:58

Для самых внимательных повторяю:
arthur2 писал(а): Но GetAsyncKeyState не годится...
Артур
 
   


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 77

    TopList  
cron