WM_CHAR - что это и как работать?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Гость
 

WM_CHAR - что это и как работать?

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

Это для перехвата нажатий, но обясните неопытным как с этим работать.

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

Сообщение GSerg » 30.04.2005 (Сб) 11:07

Это смотря что хочется получить :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Гость
 

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

хочу нажатие клавиши в программе перехватить.
Напрмер нажал пользователь "space" , а тут раз действие какое-нибуть.

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

Сообщение GSerg » 30.04.2005 (Сб) 11:59

Ну, если именно WM_CHAR, то просто обрабатывай KeyPress :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Гость
 

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

KeyPress этож на если выбран конкретный обьект на форме, а как вообще перехватить, чтобы в любом обьекте был курсор и ловить нажатие.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 30.04.2005 (Сб) 12:19

На форме выставь KeyPreview=True и отслеживай на форме.
Lasciate ogni speranza, voi ch'entrate.

Гость
 

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

Спасибо, работает почти всё как надо. Только как перехватить нажатия на стрелочки, они почему-то не считаются.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 30.04.2005 (Сб) 13:16

Смотри KeyDown
Lasciate ogni speranza, voi ch'entrate.

Гость
 

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

Результат отрицательный. Даже через Кей_даун.

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

Сообщение Amed » 30.04.2005 (Сб) 13:59

Не может быть... Стрелочки не на цифровой клавиатуре?

Гость
 

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

Нет.
А может быть такое, если у меня мультимедийная клавиатура?

Гость
 

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

Обнаружил такую вещь. Нажатия на стрелочки перехватываются лишь тогда, когда я этими стрелочками перемещаюсь в каком-нибуть текстовом поле на форме, т.е. при активном элементе "текстовое поле".
А как, чтобы без поля?

zHackLeX
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 23.10.2003 (Чт) 21:08

Сообщение zHackLeX » 30.04.2005 (Сб) 18:53

Попробуй поотменять Tabstop (=false)
у всех контролов.
There is no knowledge that is not power...

X,C,A,B,C,Z,X,A,B,C,Z....
Многие ли помнят? :)

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 30.04.2005 (Сб) 20:27

Может это подойдет?
Код: Выделить всё
'in module
Option Explicit

Public Const WH_KEYBOARD = 2
Public Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long
Public 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
Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Public Declare Function GetActiveWindow Lib "user32" () 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
        If GetActiveWindow = Form1.hWnd Then
            Select Case wParam
            Case vbKeyUp
                Beep
            End Select
        End If
        'call the next hook
        KeyboardProc = CallNextHookEx(hHook, idHook, wParam, ByVal lParam)
    End If
End Function

'in form
Option Explicit

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

:?:
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

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

Сообщение Джеффи » 01.05.2005 (Вс) 10:44

ANDLL
А ты объясни как эти пользоваться :evil:

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 01.05.2005 (Вс) 11:10

(мысли вслух) Интересно, на кого он злится?

Пользоваться очень просто: создаешь форму, создаешь модуль. То, что под in form пишешь в форму. То, что под in module пишешь в модуль. Сие отлалвивает нажатия клавиш на твоей форме. В данном случае, если ты нажмешь кнопку "вверх" прозвучит звуковой сигнал. Даже если в этот момент стоит фокус на кнопке, и ее tabstop=true. Можно приписать в select case другие константы, что бы отслеживать другие события.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

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

Сообщение Джеффи » 01.05.2005 (Вс) 12:28

ANDLL
Я не злюсь просто мне один раз уже писали этот код и не объяснили как он работает...

Но моя проблема в том что мне нужно ловить нажатия не только на форме, а во всей винде! :roll:

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

Сообщение Amed » 01.05.2005 (Вс) 12:36

Господи... Соображайте, юзеры, соображайте головой! :)

Замени
Код: Выделить всё
        If GetActiveWindow = Form1.hWnd Then
            Select Case wParam
            Case vbKeyUp
                Beep
            End Select
        End If

на
Код: Выделить всё
            Select Case wParam
            Case vbKeyUp
                Beep
            End Select


Это убирает проверку того, что на экране в данный момент твоя программа. Идею раскрыл?

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

Сообщение Джеффи » 01.05.2005 (Вс) 13:41

Всё теперь всё понял :lol:
Спасибо :wink:

Zubik
Новичок
Новичок
 
Сообщения: 40
Зарегистрирован: 07.08.2006 (Пн) 15:54

Сообщение Zubik » 13.09.2006 (Ср) 18:13

Слушайте, а у меня с этим кодом отлавливания нажатия стрелки вверх при неактивной форме не происходит.
Это у меня так или у всех тоже?

AjaxVS
Постоялец
Постоялец
 
Сообщения: 506
Зарегистрирован: 01.12.2004 (Ср) 13:12
Откуда: Donetsk, Battle.Net

Сообщение AjaxVS » 13.09.2006 (Ср) 18:36

Странно.. у меня с GetAsyncKeyState() все всегда и везде перехватывает.. Точнее, отслеживает. Пример смотри в ApiGuide37.

Zubik
Новичок
Новичок
 
Сообщения: 40
Зарегистрирован: 07.08.2006 (Пн) 15:54

Сообщение Zubik » 14.09.2006 (Чт) 18:41

с горем пополам более-менее розобрался как хук работает на клавиатуру... но всётаки, как запретить кнопку-флажок ( её код 91), чтобы она не разворачивала меню кнопки "Пуск". Возможно ли это осуществить локально? или же всётаки придётся использовать библиотеку.
Кучу примеров просмотрел, но там происходит только лиш отлов нажатий кнопок (клавиатурные шпионы).
Меня интересует именно кнопка-флажок, как с ней быть?

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

Сообщение keks-n » 14.09.2006 (Чт) 19:27

Журнальный хук от Оловянникова не пробовал?
Изображение

Zubik
Новичок
Новичок
 
Сообщения: 40
Зарегистрирован: 07.08.2006 (Пн) 15:54

Сообщение Zubik » 14.09.2006 (Чт) 19:31

пример видел (он ловит события), но моих знаний и умений недостаточно, чтобы определить, способен ли тот хук заблокировать нужную мне клавиш :(

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

Сообщение keks-n » 14.09.2006 (Чт) 20:14

А попробовать? И ещё, там скорее всего(хотя точно не знаю) шлётся WM_SYSKEYDOWN и WM_SYSKEYUP. Поправьте меня, если ошибся.
Изображение


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9

    TopList