Альтернатива GetAsynsKeyState

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

Альтернатива GetAsynsKeyState

Сообщение Джеффи » 27.04.2005 (Ср) 17:06

Вот такая ситуация, я ловлю нажатия с клавы и собираю в слова...
Но использую для этого GetAsynsKeyState и вызываю её 40 раз, я думаю это тормозит немного процесс...

Если что-то другое...

Например функция которая возвращает код нажатой клавиши...

xolod
Гуру
Гуру
 
Сообщения: 1162
Зарегистрирован: 15.01.2004 (Чт) 0:42
Откуда: Moscow

Сообщение xolod » 27.04.2005 (Ср) 17:11

Отрабатывай сообщение WM_CHAR

Constant ERROR_SUCCESS deprecated. I'm so happy.
Программирование и дизайн – http://www.macrointellect.ru

Джеффи
Бывалый
Бывалый
 
Сообщения: 256
Зарегистрирован: 06.03.2005 (Вс) 0:26

Сообщение Джеффи » 27.04.2005 (Ср) 17:14

Хм....
Наверное ты не понял, мне нужно вообще а не только в окне моей проги...
А лучше напиши код...

xolod
Гуру
Гуру
 
Сообщения: 1162
Зарегистрирован: 15.01.2004 (Чт) 0:42
Откуда: Moscow

Сообщение xolod » 27.04.2005 (Ср) 17:17

1) Найди поиском по форуму - как сделать Native DLL на VB.
2) Поставь глобальный хук на систему
3) Отрабатывай WM_CHAR

Constant ERROR_SUCCESS deprecated. I'm so happy.
Программирование и дизайн – http://www.macrointellect.ru

Джеффи
Бывалый
Бывалый
 
Сообщения: 256
Зарегистрирован: 06.03.2005 (Вс) 0:26

Сообщение Джеффи » 27.04.2005 (Ср) 17:18

xolod писал(а):1) Найди поиском по форуму - как сделать Native DLL на VB.
2) Поставь глобальный хук на систему
3) Отрабатывай WM_CHAR

1. Подходящих тем или сообщений не найдено
2. Не понял
3. Не умею

xolod
Гуру
Гуру
 
Сообщения: 1162
Зарегистрирован: 15.01.2004 (Чт) 0:42
Откуда: Moscow

Сообщение xolod » 27.04.2005 (Ср) 17:25

1) Хук, он же Ловушка, он же Hook. Для установки есть API SetWindowsHookEx, для того чтобы поставить ловушку на уровне системы, нужно ее оформить в виде динамически подгружаемой библиотеки (DLL).
2) Написать DLL стандартными средствами VB нельзя, посему надо либо немного извратиться. Либо оформить ее на C++, например.
3) Когда поставишь ловушку на уровне системы, то сможешь ловить все сообщения посылаемые системой всем приложениям.

Constant ERROR_SUCCESS deprecated. I'm so happy.
Программирование и дизайн – http://www.macrointellect.ru

Джеффи
Бывалый
Бывалый
 
Сообщения: 256
Зарегистрирован: 06.03.2005 (Вс) 0:26

Сообщение Джеффи » 27.04.2005 (Ср) 18:07

Круто :wink:

Но мог бы ты написать код?

Alex Mals
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 11.12.2004 (Сб) 18:09

Сообщение Alex Mals » 27.04.2005 (Ср) 18:50

Он мог бы, но за 20 баксов :)

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 27.04.2005 (Ср) 20:07

Код: Выделить всё
'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

Arcanoid
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 01.01.2005 (Сб) 15:44

Сообщение Arcanoid » 27.04.2005 (Ср) 21:47

Альтернатива говоришь... ээмм... может GetKeyboardState() подойдёт?

Джеффи
Бывалый
Бывалый
 
Сообщения: 256
Зарегистрирован: 06.03.2005 (Вс) 0:26

Сообщение Джеффи » 27.04.2005 (Ср) 21:55

Код: Выделить всё
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


Вот тут что-то не так...

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 27.04.2005 (Ср) 21:59

Что-то не так? Ошибка? Какая?

Телепаты в отпуске!

Arcanoid
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 01.01.2005 (Сб) 15:44

Сообщение Arcanoid » 27.04.2005 (Ср) 22:00

В MSDN есть такое:
hMod
[in] Handle to the DLL containing the hook procedure pointed to by the lpfn parameter. The hMod parameter must be set to NULL if the dwThreadId parameter specifies a thread created by the current process and if the hook procedure is within the code associated with the current process.

Дык.. может вместо App.hInstance стоит НУЛЛь прописать :lol:

Джеффи
Бывалый
Бывалый
 
Сообщения: 256
Зарегистрирован: 06.03.2005 (Вс) 0:26

Сообщение Джеффи » 27.04.2005 (Ср) 22:03

AddressOf KeyboardProc вот ошибка

Arcanoid
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 01.01.2005 (Сб) 15:44

Сообщение Arcanoid » 27.04.2005 (Ср) 22:07

и что не компилится?

AddressOf <ИмяМодуля>.KeyboardProc

Джеффи
Бывалый
Бывалый
 
Сообщения: 256
Зарегистрирован: 06.03.2005 (Вс) 0:26

Сообщение Джеффи » 27.04.2005 (Ср) 22:14

Всё разобрался а теперь как мне получить чистый символ?=)))

Гость
 

Сообщение Гость » 30.04.2005 (Сб) 10:04

Да! Приведите пример, как именно я перехвачу нажатие, к примеру "Space"

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 21.12.2005 (Ср) 16:03

Пишешь код, который выводит все WM_CHAR в label. Запускаешь прогу и жмёшь свой Space. Его код добавится.
А вооюще эти константы API-Viewer'ом (стандартным) смотрятся, начинаются на VK_ , например: VK_F1
Изображение

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 21.12.2005 (Ср) 16:11

Anonymous писал(а):Да! Приведите пример, как именно я перехвачу нажатие, к примеру "Space"


Наступила пора школьных каникул...
И с каких пор у нас могут писать гости?

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 21.12.2005 (Ср) 16:24

Баг в phpBB, я это в 6-ой раз вижу. Похоже он когда набирал сообщение разлогинился, а форма набора-то осталась! Он жмёт "Отправить", а cookie о том что он зареген нет, вот "умный" phpBB его гостем и обозвал :)
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 21.12.2005 (Ср) 18:21

Во-первых, кекс, нефиг отвечать на сообщения апрельской давности и тем будоражить умы общественности :)
Во-вторых, Гость отображается в том случае, когда афтар вопроса был забанен с удалением аккаунта.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 21.12.2005 (Ср) 20:06

Я на дату не посмотрел... Глубоко извиняюсь... Простите меня, кто сможет...
Изображение

E'rsh
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 111
Зарегистрирован: 12.06.2005 (Вс) 13:52
Откуда: Калининград

Сообщение E'rsh » 22.12.2005 (Чт) 1:11

:!: Код приведенный выше (Amed 27.04.2005 (Ср) 19:07) перехватывает только с окна текущей программы!

:?: Кто нить напише, пожайлуста, точный код создания Хука на клавишу Space. Plase....
Нельзя предугадать действие дураков, поскольку они крайне изобретательны.

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 23.12.2005 (Пт) 19:10

Почти универсальный код простановки хуков от Оловянникова.

Пример использования в папке test, не забудь перекомпилить/зарегестрить DLL-ку из папки Source
Вложения
SysHookDll.zip
(13.8 Кб) Скачиваний: 51
Изображение

Maitris
Постоялец
Постоялец
 
Сообщения: 656
Зарегистрирован: 02.03.2005 (Ср) 21:00
Откуда: Из другой цивилизации.

Сообщение Maitris » 24.12.2005 (Сб) 12:00

А GetTroyState нет такой функции случайно? :lol:
----

E'rsh
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 111
Зарегистрирован: 12.06.2005 (Вс) 13:52
Откуда: Калининград

Сообщение E'rsh » 25.12.2005 (Вс) 16:31

keks-n
Кстати какие есть способы регистрации DLL?
Кто какие знает?
Нельзя предугадать действие дураков, поскольку они крайне изобретательны.

E'rsh
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 111
Зарегистрирован: 12.06.2005 (Вс) 13:52
Откуда: Калининград

Сообщение E'rsh » 25.12.2005 (Вс) 16:47

keks-n
СПАСИБО за DLL :lol:
Но она перехватывает заданные функции :cry:
:?: А допустим факт копирования WINDOWSом можно поймать
Нельзя предугадать действие дураков, поскольку они крайне изобретательны.

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 25.12.2005 (Вс) 17:08

File Notification?

1) Объявления API-функций:

Код: Выделить всё
Private Declare Function FindFirstChangeNotification Lib "kernel32.dll" Alias "FindFirstChangeNotificationA" (ByVal lpPathName As String, ByVal bWatchSubtree As Long, ByVal dwNotifyFilter As Long) As Long
Private Declare Function FindNextChangeNotification Lib "kernel32.dll" (ByVal hChangeHandle As Long) As Long


2) Описание базовых механизмов работы (из книги "Hardcore Visual Basic"):
http://vb.mvps.org/hardcore/html/theser ... cation.htm
http://vb.mvps.org/hardcore/html/thecli ... cation.htm

3) Скачать исходники клиента и сервера, а также всех остальных проектов к книге "Hardcore VB":
http://vb.mvps.org/hardcore/html/sourcecode.htm

4) Посетить обязательно:
http://msdn.microsoft.com
Моду создают модоки, а распространяют модозвоны.

E'rsh
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 111
Зарегистрирован: 12.06.2005 (Вс) 13:52
Откуда: Калининград

Сообщение E'rsh » 27.12.2005 (Вт) 23:13

hCORe
Функцию понял, а вот как узнать что копируется (перемещается)
Заранее благодарен, извени за тупость
Нельзя предугадать действие дураков, поскольку они крайне изобретательны.

Tarantul
Бывалый
Бывалый
 
Сообщения: 235
Зарегистрирован: 13.12.2004 (Пн) 16:39
Откуда: IUnknown

Сообщение Tarantul » 28.12.2005 (Ср) 0:01

А зачем вам нужен хук? DX и его DirectInput, в частности, будет как всегда значительно быстрее и проще. :)

След.

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

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

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

    TopList