Проверить нажата ли клавиша!

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

Проверить нажата ли клавиша!

Сообщение sQx » 05.01.2004 (Пн) 22:00

Есть прога которая сидить в трее.
Нужно сделать что бы она проверяла нажата ли клавиша "1" (на клавиатуре). Если нажата msgbox.
Высшая мудрость - знать самого себя.
Ученый человек - сосуд, мудрец - источник.
Что разумно, то действительно, и что действительно, то разумно.
Знание - сила, всезнание - слабость.
Я знаю только то, что ничего не знаю.

vladimirr
Обычный пользователь
Обычный пользователь
 
Сообщения: 81
Зарегистрирован: 01.01.2004 (Чт) 22:57
Откуда: Ставрополь

Проверить нажата ли клавиша!

Сообщение vladimirr » 05.01.2004 (Пн) 22:39

Вообще-то нужна процедура, отвечающая на нажатие клавиши. Для формы это выглядит так:
Private Sub Form_KeyPress(KeyAscii As Integer)
If KeyAscii = 49 Then
MsgBox "Здесь текст сообщения", , "Заголовок"
End If
End Sub
В переменную KeyAscii передаётся значение в соответствии с кодировкой ASCII, таблица которой ниже. Как видно, за нажатие клавиши отвечает событие KeyPress. Но помни, если использовать его не для формы, то объект, для которого используешь, должен иметь фокус.

Dec Hex Символ
000 00 спец. NOP
001 01 спец. SOH
002 02 спец. STX
003 03 спец. ETX
004 04 спец. EOT
005 05 спец. ENQ
006 06 спец. ACK
007 07 спец. BEL
008 08 спец. BS
009 09 спец. Табуляция
010 0A спец. LF (Возвр. каретки)
011 0B спец. VT
012 0C спец. FF
013 0D спец. CR (Новая строка)
014 0E спец. SO
015 0F спец. SI
016 10 спец. DLE
017 11 спец. DC1
018 12 спец. DC2
019 13 спец. DC3
020 14 спец. DC4
021 15 спец. NAK
022 16 спец. SYN
023 17 спец. ETB
024 18 спец. CAN
025 19 спец. EM
026 1A спец. SUB
027 1B спец. ESC
028 1C спец. FS
029 1D спец. GS
030 1E спец. RS
031 1F спец. US
032 20 сцеп. SP (Пробел)
033 21 !
034 22 "
035 23 #
036 24 $
037 25 %
038 26 &
039 27 '
040 28 (
041 29 )
042 2A *
043 2B +
044 2C ,
045 2D -
046 2E .
047 2F /
048 30 0
049 31 1
050 32 2
051 33 3
052 34 4
053 35 5
054 36 6
055 37 7
056 38 8
057 39 9
058 3A :
059 3B ;
060 3C <
061 3D =
062 3E >
063 3F ?
064 40 @
065 41 A
066 42 B
067 43 C
068 44 D
069 45 E
070 46 F
071 47 G
072 48 H
073 49 I
074 4A J
075 4B K
076 4C L
077 4D M
078 4E N
079 4F O
080 50 P
081 51 Q
082 52 R
083 53 S
084 54 T
085 55 U
086 56 V
087 57 W
088 58 X
089 59 Y
090 5A Z
091 5B [
092 5C \
093 5D ]
094 5E ^
095 5F _
096 60 `
097 61 a
098 62 b
099 63 c
100 64 d
101 65 e
102 66 f
103 67 g
104 68 h
105 69 i
106 6A j
107 6B k
108 6C l
109 6D m
110 6E n
111 6F o
112 70 p
113 71 q
114 72 r
115 73 s
116 74 t
117 75 u
118 76 v
119 77 w
120 78 x
121 79 y
122 7A z
123 7B {
124 7C |
125 7D }
126 7E ~
127 7F 
128 80 Ђ
129 81 Ѓ
130 82 ‚
131 83 ѓ
132 84 „
133 85 …
134 86 †
135 87 ‡
136 88 €
137 89 ‰
138 8A Љ
139 8B ‹
140 8C Њ
141 8D Ќ
142 8E Ћ
143 8F Џ
144 90 ђ
145 91 ‘
146 92 ’
147 93 “
148 94 ”
149 95 •
150 96 –
151 97 —
152 98

sQx
Философ
Философ
 
Сообщения: 365
Зарегистрирован: 08.08.2002 (Чт) 19:23

Сообщение sQx » 05.01.2004 (Пн) 23:35

:D
Я и сам это знаю!

Мне нужно что бы она отлавливала нажатия на кнопки когда фокус на форме не стоит!
Нужно в таймер поставить какую то функцию. Дело все это делается через айпи-функции.
Я думал вы поймете.
Я просто забыл, давно уже не пользовался ВБ, а примеры все потерял.
Может кто то знает!
Высшая мудрость - знать самого себя.
Ученый человек - сосуд, мудрец - источник.
Что разумно, то действительно, и что действительно, то разумно.
Знание - сила, всезнание - слабость.
Я знаю только то, что ничего не знаю.

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 06.01.2004 (Вт) 8:58

Есть такая API как GetAsyncKeyState - вот ее по таймеру и вызывай. А автору постинга про KeyPress предупреждение за слишком длинный ответ не в тему.

vladimirr
Обычный пользователь
Обычный пользователь
 
Сообщения: 81
Зарегистрирован: 01.01.2004 (Чт) 22:57
Откуда: Ставрополь

Сообщение vladimirr » 06.01.2004 (Вт) 17:42

Вот здесь конфуз вышел, прошу прощения. А насчёт предупреждения... ну если каждого программиста, мало-помалу продвигающегося к цели будут так останавливать... мне страшно за наше будущее поколение программистов

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 06.01.2004 (Вт) 17:50

Это не продвижение к цели. Нечего тут полемику разводить и действия администрации обсуждать. Молодое поколение скорее запарится скролить по 5 страниц текста, являющегося цитатой из МСДН :)

vladimirr
Обычный пользователь
Обычный пользователь
 
Сообщения: 81
Зарегистрирован: 01.01.2004 (Чт) 22:57
Откуда: Ставрополь

Сообщение vladimirr » 06.01.2004 (Вт) 20:00

Всегда будущий опыть молодых наследников предопределялся знаниями бывалых. А вот на счёт лени... не надо, об этом глупо; в любом обществе найдутся представители, безумно рвущиеся к цели. Тем более что об опыте русских программистов наслышан весь мир(извините за назойливось).

Tarik
Агент Системы
Агент Системы
Аватара пользователя
 
Сообщения: 1222
Зарегистрирован: 03.01.2003 (Пт) 16:05
Откуда: Москва

Сообщение Tarik » 06.01.2004 (Вт) 21:09

Пример использования "горячих клавиш" (внаглую выдрано из APIGuide)

Код: Выделить всё
Private Const MOD_ALT = &H1
Private Const MOD_CONTROL = &H2
Private Const MOD_SHIFT = &H4
Private Const PM_REMOVE = &H1
Private Const WM_HOTKEY = &H312
Private Type POINTAPI
    x As Long
    y As Long
End Type
Private Type Msg
    hWnd As Long
    Message As Long
    wParam As Long
    lParam As Long
    time As Long
    pt As POINTAPI
End Type
Private Declare Function RegisterHotKey Lib "user32" (ByVal hWnd As Long, ByVal id As Long, ByVal fsModifiers As Long, ByVal vk As Long) As Long
Private Declare Function UnregisterHotKey Lib "user32" (ByVal hWnd As Long, ByVal id As Long) As Long
Private Declare Function PeekMessage Lib "user32" Alias "PeekMessageA" (lpMsg As Msg, ByVal hWnd As Long, ByVal wMsgFilterMin As Long, ByVal wMsgFilterMax As Long, ByVal wRemoveMsg As Long) As Long
Private Declare Function WaitMessage Lib "user32" () As Long
Private bCancel As Boolean
Private Sub ProcessMessages()
    Dim Message As Msg
    'loop until bCancel is set to True
    Do While Not bCancel
        'wait for a message
        WaitMessage
        'check if it's a HOTKEY-message
        If PeekMessage(Message, Me.hWnd, WM_HOTKEY, WM_HOTKEY, PM_REMOVE) Then
            'minimize the form
            WindowState = vbMinimized
        End If
        'let the operating system process other events
        DoEvents
    Loop
End Sub
Private Sub Form_Load()
    'KPD-Team 2000
    'URL: http://www.allapi.net/
    'E-Mail: KPDTeam@Allapi.net
    Dim ret As Long
    bCancel = False
    'register the Ctrl-F hotkey
    ret = RegisterHotKey(Me.hWnd, &HBFFF&, MOD_CONTROL, vbKeyF)
    'show some information
    Me.AutoRedraw = True
    Me.Print "Press CTRL-F to minimize this form"
    'show the form and
    Show
    'process the Hotkey messages
    ProcessMessages
End Sub
Private Sub Form_Unload(Cancel As Integer)
    bCancel = True
    'unregister hotkey
    Call UnregisterHotKey(Me.hWnd, &HBFFF&)
End Sub
Изображение

Ever tried? Ever failed? No matter. Try again! Fail again! Fail better!

_Мика_
Гуру
Гуру
 
Сообщения: 1459
Зарегистрирован: 24.10.2003 (Пт) 15:05
Откуда: г. Москва, м.Речной вокзал

Сообщение _Мика_ » 06.01.2004 (Вт) 23:01

Да ну этот пример тупой и очень длинный не легче через GetAsyncKeyState


If GetAsyncKeyState(vbKeyShift) and GetAsyncKeyState(vbKeyF12) and......... then MsgBox
-Папа, а правда, что форумы делают людей дибилами?
-гы гы гы, сынок, лол!

Max!
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 502
Зарегистрирован: 03.04.2003 (Чт) 22:08
Откуда: Литва

Сообщение Max! » 06.01.2004 (Вт) 23:17

Как правильно ее указать(Вызвать)
If GetAsyncKeyState(vbKeyShift) And GetAsyncKeyState(vbKeyF12) Then MsgBox "Hi"
Пишет Sub or function not defined :wink:
Max!

Tarik
Агент Системы
Агент Системы
Аватара пользователя
 
Сообщения: 1222
Зарегистрирован: 03.01.2003 (Пт) 16:05
Откуда: Москва

Сообщение Tarik » 06.01.2004 (Вт) 23:22

Можно и через Async...
Код: Выделить всё
'In a module
Public Const DT_CENTER = &H1
Public Const DT_WORDBREAK = &H10
Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type
Declare Function DrawTextEx Lib "user32" Alias "DrawTextExA" (ByVal hDC As Long, ByVal lpsz As String, ByVal n As Long, lpRect As RECT, ByVal un As Long, ByVal lpDrawTextParams As Any) As Long
Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Declare Function SetRect Lib "user32" (lpRect As RECT, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Global Cnt As Long, sSave As String, sOld As String, Ret As String
Dim Tel As Long
Function GetPressedKey() As String
    For Cnt = 32 To 128
        'Get the keystate of a specified key
        If GetAsyncKeyState(Cnt) <> 0 Then
            GetPressedKey = Chr$(Cnt)
            Exit For
        End If
    Next Cnt
End Function
Sub TimerProc(ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long)
    Ret = GetPressedKey
    If Ret <> sOld Then
        sOld = Ret
        sSave = sSave + sOld
    End If
End Sub

'In a form
Private Sub Form_Load()
    'KPD-Team 1999
    'URL: http://www.allapi.net/
    'E-Mail: KPDTeam@Allapi.net
    Me.Caption = "Key Spy"
    'Create an API-timer
    SetTimer Me.hwnd, 0, 1, AddressOf TimerProc
End Sub
Private Sub Form_Paint()
    Dim R As RECT
    Const mStr = "Start this project, go to another application, type something, switch back to this application and unload the form. If you unload the form, a messagebox with all the typed keys will be shown."
    'Clear the form
    Me.Cls
    'API uses pixels
    Me.ScaleMode = vbPixels
    'Set the rectangle's values
    SetRect R, 0, 0, Me.ScaleWidth, Me.ScaleHeight
    'Draw the text on the form
    DrawTextEx Me.hDC, mStr, Len(mStr), R, DT_WORDBREAK Or DT_CENTER, ByVal 0&
End Sub
Private Sub Form_Resize()
    Form_Paint
End Sub
Private Sub Form_Unload(Cancel As Integer)
    'Kill our API-timer
    KillTimer Me.hwnd, 0
    'Show all the typed keys
    MsgBox sSave
End Sub
Изображение

Ever tried? Ever failed? No matter. Try again! Fail again! Fail better!


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

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

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

    TopList  
cron