Задача: tagMSG -> KBDLLHOOKSTRUCT

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

Задача: tagMSG -> KBDLLHOOKSTRUCT

Сообщение Nicky » 01.03.2006 (Ср) 12:27

Здравствуйте все!
Столкнулся с такой проблемой: как в обработчике хука WH_GETMESSAGE из
структуры tagMSG докопаться до KBDLLHOOKSTRUCT, если конечно
tagMSG.message WM_KEYDOWN или WM_KEYUP

В идеале мне необходимо докопаться до KBDLLHOOKSTRUCT.dwExtraInfo, в котором я сам себе передаю некую инфу

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

Сообщение Alex Mals » 01.03.2006 (Ср) 21:15

Честно говоря, уже сплю :)
lParam скопируй с помощью CopyMemory в че-нить типа pKbDllHs (as KBDLLHOOKSTRUCT).
Если получится - ура, нет, завтра разберемся.

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 02.03.2006 (Чт) 9:17

Alex Mals писал(а):lParam скопируй с помощью CopyMemory в че-нить типа pKbDllHs (as KBDLLHOOKSTRUCT).
Если получится - ура, нет, завтра разберемся.


По lParam обработчика лежит структура tagMSG, по tagMSG.lParam если что-то и лежит, то не то.

Опишу проблему подробнее, т.к. понял, что не с той стороны спрашиваю:

1.Есть XpressQuantumGrid, который не хочет отдавать свои клавиатурные события форме по Form.KeyPreview=true
2.Есть NumLock, который либо включен, либо нет

Задача: единая функция обработки событий клавы и работа с доп.клавиатурой, не заботясь о состоянии NumLock (к примеру Numlock=false, жмешь доп.9 , получаешь vbKeyNumpad9, а не vbKeyPageUp)

Я вешаю два хука: WH_GETMESSAGE и WH_KEYBOARD_LL
Первый редиректит все сообщения окну (фрагмент по теме)
Код: Выделить всё
      Dim msg As TMSG
      CopyMemory msg, ByVal lParam, Len(msg)
      msg.hwnd = GetForegroundWindow
      CopyMemory ByVal lParam, msg, Len(msg)
      sysMessageProc = CallNextHookEx(fmMainMsgHook, nCode, wParam, lParam)



Второй прозрачно включает NumLock (фрагмент по теме)
Код: Выделить всё
  Dim kb As KBDLLHOOKSTRUCT
  CopyMemory kb, ByVal lParam, Len(kb)
  If Not GetBit(kb.flags, 1) Then
    l = GetNumpadVkCode(kb.scanCode)
    If l > 0 And l <> kb.vkCode Then
      SetNumLockState True
      keybd_event l, &H45, KEYEVENTF_EXTENDEDKEY Or IIf(wParam = WM_KEYUP, KEYEVENTF_KEYUP, 0), 0
      sysKeyboardProc = 1
      Exit Function
    End If
  End If
sysKeyboardProc = CallNextHookEx(fmMainKbdHook, nCode, wParam, lParam)


С NumLock все работает замечательно, с редиректом след.проблема:
на форме лежит textbox и события по нему тоже редиректятся форме и набора текста не происходит, а также BackSpace, Delete и т.д.

Посоветуйте, как выпутаться из ситуации?!

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 02.03.2006 (Чт) 11:59

А ты уверен, что в структуре tagMSG (она же просто MSG) есть указатель на KBDLLHOOKSTRUCT?

MSDN говорит несколько другое...
Весь мир матрица, а мы в нем потоки байтов!

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 02.03.2006 (Чт) 12:08

Тему снимаю, т.к. выпутался сам.
Всем спасибо
Решение:
Код: Выделить всё
Private Sub Form_Load()
  fmMainMsgHook = SetWindowsHookEx(WH_GETMESSAGE, AddressOf sysMessageProc, App.hInstance, App.ThreadID)
  fmMainKbdHook = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf sysKeyboardProc, App.hInstance, 0)
End Sub

Function sysMessageProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  If nCode < HC_ACTION Then
    sysMessageProc = CallNextHookEx(fmMainMsgHook, nCode, wParam, lParam)
    Exit Function
  End If
 
  Dim msg As TMSG
  CopyMemory msg, ByVal lParam, Len(msg)
  Select Case msg.message
    Case WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN, WM_SYSKEYUP
      If bNoRedirect Then
        If msg.message = WM_KEYUP Then bNoRedirect = False
      Else
        msg.hwnd = GetForegroundWindow
        CopyMemory ByVal lParam, msg, Len(msg)
      End If
  End Select
  sysMessageProc = CallNextHookEx(fmMainMsgHook, nCode, wParam, lParam)
End Function

Sub fmMainKeyDown(lKeyCode As Integer, ByVal lShift As Long)
  Select Case lKeyCode
    ...
    Case Else
      tboxFind.SetFocus
      bNoRedirect = True
      SendKey lKeyCode
  End Select
End Sub

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 02.03.2006 (Чт) 12:12

!Viper! писал(а):А ты уверен, что в структуре tagMSG (она же просто MSG) есть указатель на KBDLLHOOKSTRUCT?

MSDN говорит несколько другое...


MSDN рулит, но думал, что это логично - в хуке WH_GETMESSAGE получить коды нажатых клавиш, ведь событие - клавиатурное!


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

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

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

    TopList