Определить нажатие неожидаемой клавиши

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

Определить нажатие неожидаемой клавиши

Сообщение Space » 03.05.2009 (Вс) 2:44

Как определить нажата ли в текущий момент любая клавиша глобально в системе, кроме ожидаемой, без перебора всех клавиш?
Код: Выделить всё
    For VirtualKeyCode = 0 To 255
     if VirtualKeyCode=KeyWait Then GoTo 20
     If GetAsyncKeyState(VirtualKeyCode) <= -32767 Then
      GoTo 100    'нажата не ожидаемая клавиша
     End If
20   Next

Xcode
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 131
Зарегистрирован: 31.10.2008 (Пт) 8:12
Откуда: Pavlodar

Re: Определить нажатие неожидаемой клавиши

Сообщение Xcode » 03.05.2009 (Вс) 8:27

offtopic: Боже мой... теперь я убедился почему не рекомендуют использовать GoTo.

arvitaly
Постоялец
Постоялец
 
Сообщения: 485
Зарегистрирован: 12.04.2009 (Вс) 0:30
Откуда: Казань

Re: Определить нажатие неожидаемой клавиши

Сообщение arvitaly » 03.05.2009 (Вс) 12:12

GoTo не рекомендуют только тем кто не умеет им пользоваться (школьникам и студентам первых курсов), как в данном примере.

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Определить нажатие неожидаемой клавиши

Сообщение Space » 03.05.2009 (Вс) 17:53

что вам не нравится? :eye:

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: Определить нажатие неожидаемой клавиши

Сообщение awl100Alex » 03.05.2009 (Вс) 22:41

Space писал(а):Как определить нажата ли в текущий момент любая клавиша глобально в системе...

Хук на WH_KEYBOARD_LL ставится глобально прямо из текущего приложения. Определить можно что хочешь! :)

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Определить нажатие неожидаемой клавиши

Сообщение Space » 03.05.2009 (Вс) 22:58

ну, я потому и парюсь, что мне хук не подходит. Каспер ругается. И в цикле ругается. А мне всего-то надо отлавливать глобально комбинацию Ctrl+Pass для активации окна.
А где эти красопеты, которым мой GoTo не понравился?

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: Определить нажатие неожидаемой клавиши

Сообщение awl100Alex » 03.05.2009 (Вс) 23:18

Каспер ругается на хук??? :shock:

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Определить нажатие неожидаемой клавиши

Сообщение iGrok » 03.05.2009 (Вс) 23:25

Space писал(а):А мне всего-то надо отлавливать глобально комбинацию Ctrl+Pass для активации окна.

А чем тебе RegisterHotkey не мил?

А Goto у тебя реально странный. Впрочем, поскольку весь цикл не вижу - точно не скажу...
label:
cli
jmp label

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Определить нажатие неожидаемой клавиши

Сообщение Space » 03.05.2009 (Вс) 23:56

да чем он странный?
RegisterHotkey там же вроде только 1 клавиша Ctrl+Key :twisted: , да и тормозной он! А мне надо типа Ctrl+123:)

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: Определить нажатие неожидаемой клавиши

Сообщение awl100Alex » 04.05.2009 (Пн) 0:38

Space писал(а):А мне надо типа Ctrl+123:)

Нажми последовательно не отпуская клавишь - Ctrl, 1, 2, 3...
Код: Выделить всё
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer

Private Sub Timer1_Timer()
Dim Ctrl, Key1, Key2 As Byte
If GetAsyncKeyState(vbKeyControl) < 0 Then Ctrl = 1
If GetAsyncKeyState(vbKey1) < 0 Then Key1 = 1
If GetAsyncKeyState(vbKey2) < 0 Then Key2 = 1
If GetAsyncKeyState(vbKey3) < 0 And Ctrl = 1 And Key1 = 1 And Key2 = 1 _
Then MsgBox "Нажаты Ctrl+1+2+3"
End Sub

P.S.
А так чтобы без перебора... наверное, не получится. Да и зачем???

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Определить нажатие неожидаемой клавиши

Сообщение Space » 04.05.2009 (Пн) 0:43

а мне надо отпуская клавиши и пароль заранее неизвестен, его ставит юзер :)
Пипец, я дождусь объяснения по поводу наездов на мой GoTo?

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Определить нажатие неожидаемой клавиши

Сообщение iGrok » 04.05.2009 (Пн) 2:21

Мда.. Тогда RegisterHotkey реально не в тему. Я не сразу понял, что тебе не одну клавишу надо, а целый пароль набирать.
По хорошему, это всё-таки надо делать через хук..

Space писал(а):Пипец, я дождусь объяснения по поводу наездов на мой GoTo?

Ну поскольку я не вижу, что там у тебя после цикла и до метки 100: - не факт, что наезд будет оправданным.
Но почему, собственно, не так?
Код: Выделить всё
For VirtualKeyCode = 0 To 255
  if VirtualKeyCode <> KeyWait AND GetAsyncKeyState(VirtualKeyCode) <= -32767 Then Exit For
Next

Ну и остальную логику с метками переделать соответствующе..
Иначе это же реально спагетти а не код..
label:
cli
jmp label

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Определить нажатие неожидаемой клавиши

Сообщение Space » 04.05.2009 (Пн) 4:20

что за спагетти? :) Я уже привык так писать, чтобы брейкпоинты ставить. А насчёт 100, я не такой наивный, чтобы ставить код ещё после Next и перед 100, если это имелось ввиду - опять таки привычка старого программування ходить по меткам :) А для GoTo 20 есть замена?

Xcode
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 131
Зарегистрирован: 31.10.2008 (Пт) 8:12
Откуда: Pavlodar

Re: Определить нажатие неожидаемой клавиши

Сообщение Xcode » 04.05.2009 (Пн) 10:01

Space писал(а):что за спагетти? :) Я уже привык так писать, чтобы брейкпоинты ставить. А насчёт 100, я не такой наивный, чтобы ставить код ещё после Next и перед 100, если это имелось ввиду - опять таки привычка старого программування ходить по меткам :) А для GoTo 20 есть замена?

Для 20:
Код: Выделить всё
For VirtualKeyCode = 0 To 255
     if VirtualKeyCode<>KeyWait Then
        If GetAsyncKeyState(VirtualKeyCode) <= -32767 Then
        GoTo 100    'нажата не ожидаемая клавиша
       End If
     End If
Next

Есля правильно понял насчет метки 100, то код выглядит так:

Код: Выделить всё
    For VirtualKeyCode = 0 To 255
     if VirtualKeyCode=KeyWait Then GoTo 20
     If GetAsyncKeyState(VirtualKeyCode) <= -32767 Then
      GoTo 100    'нажата не ожидаемая клавиша
     End If
20   Next
100
...any code...

Тогда делай так:
Код: Выделить всё
For VirtualKeyCode = 0 To 255
     if VirtualKeyCode<>KeyWait Then
        If GetAsyncKeyState(VirtualKeyCode) <= -32767 Then
        Exit For    'нажата не ожидаемая клавиша
       End If
     End If
Next

А вообще, я имел ввиду что в общем случае использование GoTo затрудняет понимание кода.

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: Определить нажатие неожидаемой клавиши

Сообщение awl100Alex » 04.05.2009 (Пн) 15:02

Давай расставим точки над “и”...
Space писал(а):...мне всего-то надо отлавливать глобально комбинацию Ctrl+Pass для активации окна.
...
...мне надо типа Ctrl+123:)
...
...хук не подходит. Каспер ругается...

То есть, из всего изложенного... можно понять: есть некая сверхсекретная форма твоего приложения. Доступ к ней (активация) через пароль. Нужно написать логику при которой пользователь нажав Ctrl далее набирает свой пароль, но если в ходе набора будет нажата «неожидаемая» клавиша, то выход... Правильно?

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Определить нажатие неожидаемой клавиши

Сообщение Space » 04.05.2009 (Пн) 18:21

правильно. Через форму ввода пароля делать не стал, т.к. нужно оперативное скрытие/показ. На мой вариант Каспер ругается, дескать кейлог. Мне это очень не нравится. В принципе, не хотелось бы откатываться на форму ввода пароля (лишний клик, нажатие клавиш).

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: Определить нажатие неожидаемой клавиши

Сообщение awl100Alex » 05.05.2009 (Вт) 13:05

Не думаю, что это будет правильно.
Может получится так, что пользователь нажав Ctrl в процессе набора пароля случайно нажмет HotKey активной в данный момент проги. А вот что последует за этим HotKey какой-нибудь проги, остается только гадать.
Тоже самое, если Ctrl+Alt, Ctrl+Alt+Shift, Ctrl+Shift – не имеет значения, всё равно случайно может сработать HotKey.
Так что, лучше все-таки хук, а у Каспера запиши свою прогу в доверенную зону и ругня прекратится. :)

arvitaly
Постоялец
Постоялец
 
Сообщения: 485
Зарегистрирован: 12.04.2009 (Вс) 0:30
Откуда: Казань

Re: Определить нажатие неожидаемой клавиши

Сообщение arvitaly » 06.05.2009 (Ср) 1:41

Пипец, я дождусь объяснения по поводу наездов на мой GoTo?

Ссори, весна.. коты блохастые котят себе куют, ну и у нас жизнь не все у ноута проходит
Код: Выделить всё
2 a=inputbox ("Введите а")
b=inputbox ("Введите b")
if isNumeric(a) and isNumeric(b) then goto 6 else goto 3
6 if a<100 then goto 1 else goto 3
if b>100 then goto 1 else goto 4
3 msgbox "Все плохо в a":goto 2
4 msgbox "Все плохо в b":goto 2
1 c=a+b
if c>7 then goto 2
msgbox c


Код: Выделить всё
do
     a=inputbox ("Input a")
     b=inputbox ("input b")
     if isNumeric(a) and isNumeric(b) then
         if a<100 then
            if b<100 then
                 c=a+b
                 if c>7 then msgbox "All right"
            else
                msgbox "b плохая"
            end if
        else
            msgbox "a плохая"
        end if
    else
        msgbox "a или b не цифры"
    end if
loop while c<7


И это уже так в случае 10 строк а когда их 1000 (ммм ну как бы это сказать помягче - типа через полгода у тебя у самого уйдет времени больше на разбор своей же программы чем на создание такой же новой)


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

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

Сейчас этот форум просматривают: SemrushBot и гости: 33

    TopList  
cron