Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перехват нажатий на клавиатуру 
:(
    Опции темы
ProgramerForever
Дата 29.4.2008, 06:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 15.11.2006
Где: Новосибирск

Репутация: 2
Всего: 5



Нужно, чтобы при нажатии на "~" вызывалась форма методом Show. Проблема в том, что на исходной форме очень-очень много элементов управления, и для каждого писать обработчик - неразумно и нерационально. Может есть способ??
PM MAIL WWW ICQ   Вверх
Akina
Дата 29.4.2008, 08:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Цитата(ProgramerForever @  29.4.2008,  07:17 Найти цитируемый пост)
на исходной форме очень-очень много элементов управления, и для каждого писать обработчик - неразумно и нерационально

Если контрол может получать фокус и обрабатывать нажатия (пусть и дефолтной процедурой) - для каждого такого контрола придется писАть процедуру. Впрочем, все они могут тупо вызывать одну и ту же Sub.
Плюс обработчик (уровня) формы.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
voltaren
Дата 29.4.2008, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 17.11.2007

Репутация: нет
Всего: нет



Есть метод это сделать средствами WinAPI и Timer

Код

Public Declare Function GetKeyState Lib "user32" Alias "GetKeyState" (ByVal nVirtKey As Long) As Integer
Public Declare Function GetAsyncKeyState Lib "user32" Alias "GetAsyncKeyState" (ByVal vKey As Long) As Integer


Код


Public Sub Timer1_Timer()

    If ( GetAsyncKeyState(192) <> 0 ) then ' 192 это код клавиши тильды
    ' клавиша нажата

    End If


End Sub




Поидее код можно получить с помощью Asc("~")  только для тильды не работает а для букв работает, надо просто подобрать smile

Есть конечно еще метод, через Хуки это сделать но он сложнееsmile
PM MAIL   Вверх
ProgramerForever
Дата 29.4.2008, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 15.11.2006
Где: Новосибирск

Репутация: 2
Всего: 5



Я понял, что последний вариант перехватывает клавиши отовсюду. А можно ли перехватывать с помощью API нажатия в активном окне?
А зачем эта строка?
Цитата(voltaren @  29.4.2008,  16:04 Найти цитируемый пост)
Public Declare Function GetKeyState Lib "user32" Alias "GetKeyState" (ByVal nVirtKey As Long) As Integer


Ещё: Я потестил код. Он срабатывает n раз в секунду. А как обрабатывать ОДНО, КАЖДОЕ нажатие? Как я догадываюсь, с помощью хуков? Тех самых, которые 
Цитата

через Хуки это сделать но он сложнее smile


Это сообщение отредактировал(а) ProgramerForever - 29.4.2008, 12:44
PM MAIL WWW ICQ   Вверх
Insect
Дата 29.4.2008, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 7.4.2008
Где: Н.Н.

Репутация: нет
Всего: нет



Цитата

А можно ли перехватывать с помощью API нажатия в активном окне?



можно отфильтровывать ненужное опять таки с использованием API функции (GetActiveWindow вроде как называецца)
PM MAIL ICQ   Вверх
voltaren
Дата 29.4.2008, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 17.11.2007

Репутация: нет
Всего: нет



Insect прав с помощью функции GetActiveWindow проверять какое окно активное smile
не понял что вы имели ввиду под этой фразой "А как обрабатывать ОДНО, КАЖДОЕ нажатие?" ?
PM MAIL   Вверх
ProgramerForever
Дата 29.4.2008, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 15.11.2006
Где: Новосибирск

Репутация: 2
Всего: 5



Типа кейлоггера (но мне не для этого smile ). Нажал клавишу - сработало событие в моей программе, хотя она, допустим, свёрнута.
PM MAIL WWW ICQ   Вверх
Insect
Дата 29.4.2008, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 7.4.2008
Где: Н.Н.

Репутация: нет
Всего: нет



ProgramerForever, тагда фильтр по хэндлу smile 
PM MAIL ICQ   Вверх
ProgramerForever
Дата 29.4.2008, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 15.11.2006
Где: Новосибирск

Репутация: 2
Всего: 5



Код

Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer


Public Sub Timer1_Timer()
    If (GetAsyncKeyState(192) <> 0) Then   ' 192 ýòî êîä êëàâèøè òèëüäû
    ' êëàâèøà íàæàòà
    Beep
    End If
End Sub

Пробуй код, сразу поймёшь о чём я. мне надо не 100 раз в секунду, а один раз.
PM MAIL WWW ICQ   Вверх
voltaren
Дата 29.4.2008, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 17.11.2007

Репутация: нет
Всего: нет



а в чем проблема таймера надо поставить так что бы раз в секунду работал! Или например добавить переменную типа Boolean когда клавиша нажимается первый раз она становиться True и больше не срабатывает даже если клавиша нажата когда клавишу отпускаешь то переменная сбрасывается в False
PM MAIL   Вверх
Insect
Дата 30.4.2008, 08:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 7.4.2008
Где: Н.Н.

Репутация: нет
Всего: нет



ProgramerForever, ну других способов не знаю...
А чем тебя этот не устраивает? Боишься умыкнуть у винды лишний таймер? smile 

P.S. В BlitzBasic' е (специальный бейсик для быстрого написания игр) имеется такая функция как IfKeyHit(#код#)... Но использовать приложение, созданное на нём специально для твоей задачи, не выгодно- экзэшник минимум 800 Кб делает да и не факт что получиццо...
PM MAIL ICQ   Вверх
ProgramerForever
Дата 30.4.2008, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 15.11.2006
Где: Новосибирск

Репутация: 2
Всего: 5



Цитата(voltaren @  30.4.2008,  00:18 Найти цитируемый пост)
 добавить переменную типа Boolean когда клавиша нажимается первый раз она становиться True и больше не срабатывает даже если клавиша нажата когда клавишу отпускаешь то переменная сбрасывается в False

Я обдумывал такой вариант, всё хорошо, но..
Цитата(voltaren @  30.4.2008,  00:18 Найти цитируемый пост)
 когда клавишу отпускаешь то переменная сбрасывается в False

Как это реализовать??
PM MAIL WWW ICQ   Вверх
JusTalionis
Дата 1.5.2008, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 576
Регистрация: 11.7.2006

Репутация: 6
Всего: 17



Я обычно отслеживал время: после того как частота автоповтора прекратилась - значит отпущена клавиша. Собственно, это время задаст в твоей проге предел: с какой макс скоростью юзеру позволено долбить по этой клавише.
 
PM MAIL   Вверх
ProgramerForever
Дата 1.5.2008, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 15.11.2006
Где: Новосибирск

Репутация: 2
Всего: 5



Точно! Буду копать в этом направлении.
PM MAIL WWW ICQ   Вверх
Rrader
  Дата 2.5.2008, 07:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 6
Всего: 191



ProgramerForever, держи пример

Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  Hook.rar 4,98 Kb


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB6 | Следующая тема »


 




[ Время генерации скрипта: 0.0971 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.