Узнать какая нажата клавиша на клаве

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
VLADosik
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 12.08.2006 (Сб) 7:48
Откуда: Россия,Пенза

Узнать какая нажата клавиша на клаве

Сообщение VLADosik » 03.02.2007 (Сб) 21:23

Народ помогите!
Значит мне надо сделать прогу... которая узнаёт какая кнопка на клаве нажата... допустим я открыл блокнот и начал писать там "бла бла бла" в проге должно отразится допустим в Text'овом окне "бла бла бла" и так чтобы отображались все нажатые кнопки на клаве.

JohnK
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 874
Зарегистрирован: 03.08.2002 (Сб) 0:35
Откуда: 48.02` 37.58`

Сообщение JohnK » 03.02.2007 (Сб) 21:29

Если хочешь следить за всеми нажатиями клавиш по системе, нужно ставить глобальный хук на клаву.
Смотри в сторону SetWindowsHookEx(WH_KEYBOARD, procadd, hMod, 0)
Причем процедура обработки клавиш должна находиться в dll.
dll пиши не на VB
SELECT * FROM girls WHERE tits NOT NULL AND age BETWEEN 18 AND 25 ORDER BY Beauty

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 03.02.2007 (Сб) 22:19

Могу дать свой пример глобального хука на C++.
Надо?
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

VLADosik
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 12.08.2006 (Сб) 7:48
Откуда: Россия,Пенза

Сообщение VLADosik » 04.02.2007 (Вс) 8:41

BV писал(а):Могу дать свой пример глобального хука на C++.
Надо?

давай=)
JohnK, а пример кода не мог бы привести... а то я с DLL мало знаком...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 04.02.2007 (Вс) 9:43

VLADosik
Пример чего? Процедуры обратного вызова на другом языке?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

VLADosik
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 12.08.2006 (Сб) 7:48
Откуда: Россия,Пенза

Сообщение VLADosik » 04.02.2007 (Вс) 9:55

Хакер писал(а):VLADosik
Пример чего? Процедуры обратного вызова на другом языке?

Да

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 04.02.2007 (Вс) 10:10

VB:
Код: Выделить всё
Public Function KeyboardProc(ByVal idHook As Long, ByVal wParam As Long, ByVal lParam As Long) As Long


End Function


Сишный эквивалент:
Код: Выделить всё
INT WINAPI KeyboardProc(INT idHook, INT wParam, INT lParam)
{

}
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

VLADosik
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 12.08.2006 (Сб) 7:48
Откуда: Россия,Пенза

Сообщение VLADosik » 04.02.2007 (Вс) 11:42

Хакер, немог бы подробнее объяснить как ето сделать.
Любая нажатая клавиша чтобы отбражалась в Text'овом окне.
Заранее спасибо.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 04.02.2007 (Вс) 11:52

—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 04.02.2007 (Вс) 13:11

VLADosik писал(а):давай


Бери...
Вложения
KbdHook.rar
(18.43 Кб) Скачиваний: 75
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

VLADosik
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 12.08.2006 (Сб) 7:48
Откуда: Россия,Пенза

Сообщение VLADosik » 04.02.2007 (Вс) 16:01

Хакер писал(а):http://www.allapi.net/apilist/35AD48797A780091740CBCF14EBC094D.html

спс за код. Ето как я понял модуль?
и как етот модуль привезать к форме? как он бооще работает.
Сорри на нубский вопрос. :oops:

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 04.02.2007 (Вс) 16:14

Часть первая:
Код: Выделить всё
'In a module
Public Const WH_KEYBOARD = 2
Public Const VK_SHIFT = &H10
Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long
Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Public hHook As Long
Public Function KeyboardProc(ByVal idHook As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    'if idHook is less than zero, no further processing is required
    If idHook < 0 Then
        'call the next hook
        KeyboardProc = CallNextHookEx(hHook, idHook, wParam, ByVal lParam)
    Else
        'check if SHIFT-S is pressed
        If (GetKeyState(VK_SHIFT) And &HF0000000) And wParam = Asc("S") Then
            'show the result
            Form1.Print "Shift-S pressed ..."
        End If
        'call the next hook
        KeyboardProc = CallNextHookEx(hHook, idHook, wParam, ByVal lParam)
    End If
End Function



Часть вторая:
Код: Выделить всё
'In a form, called Form1
Private Sub Form_Load()
    'KPD-Team 2000
    'URL: http://www.allapi.net/
    'E-Mail: KPDTeam@Allapi.net
    'set a keyboard hook
    hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf KeyboardProc, App.hInstance, App.ThreadID)
End Sub
Private Sub Form_Unload(Cancel As Integer)
    'remove the windows-hook
    UnhookWindowsHookEx hHook
End Sub


Часть первая:
Код: Выделить всё
'In a module
Public Const WH_KEYBOARD = 2
...



In a module (In - в, module - модуль ; итого: В модуле) - означает что этот кусок нужно помешать в модуль.

Часть вторая:
Код: Выделить всё
'In a form, called Form1
...

In a form, called Form1 (In - в, form - форма, called - причастие - названной; итого: В форме, названной Form1) - означает что нужно поместить это кусок в код формы, которая должна называться Form1

_____________________

Глупой вопрос исчез?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

VLADosik
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 12.08.2006 (Сб) 7:48
Откуда: Россия,Пенза

Сообщение VLADosik » 04.02.2007 (Вс) 16:52

Haker, я не понял суть етого исходника всё сделал...
когда нажимаб Shift+s на форме появляется 4 раза надпись Shift+s presents... и всё ...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 04.02.2007 (Вс) 16:55

Это пример по созданию хуков. Здесь делатся хук на Ctrl+S. Если не в силах переделать ЭТО в ТО что тебе нужно, то стоит забросить эту идею.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

JohnK
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 874
Зарегистрирован: 03.08.2002 (Сб) 0:35
Откуда: 48.02` 37.58`

Сообщение JohnK » 04.02.2007 (Вс) 23:19

Хакер
допустим я открыл блокнот и начал писать там "бла бла бла" в проге должно отразится допустим в Text'овом окне "бла бла бла" и так чтобы отображались все нажатые кнопки на клаве.


:lol:

VLADosik
JohnK, а пример кода не мог бы привести... а то я с DLL мало знаком...


Допустим у тебя есть некая YOURHOOK.DLL, в ней есть функции KeyProc:

Код: Выделить всё
'MODULE1

Private Declare Sub SetKeyHook Lib "YOURHOOK" (ByVal hKeyHook As Long, ByVal iForm As Long)

Public Function SetLock() As Boolean
Dim procadd As Long
SetLock = False
hMod = LoadLibrary("YOURHOOK.DLL")
If hMod > 0 Then
'Set Key Hook
procadd = GetProcAddress(hMod, "KeyProc")
hHookLockKey = SetWindowsHookEx(WH_KEYBOARD, procadd, hMod, 0)
On Error Resume Next
If hHookLockKey > 0 Then Call SetKeyHook(hHookLockKey, 0)
SetLock = True
                 Else
   FreeLibrary (hMod)
End If
End Function


Убрать хук:
Код: Выделить всё
Call UnhookWindowsHookEx(hHookLockKey)
SELECT * FROM girls WHERE tits NOT NULL AND age BETWEEN 18 AND 25 ORDER BY Beauty


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

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

Сейчас этот форум просматривают: Yandex-бот и гости: 95

    TopList