Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Отслеживание клавиатуры Добавлено: 10.12.08 13:38  

Автор вопроса:  KreAtoR
Подскажите функцию, с помощью которой я могу отследить нажатые клавиши. Мне необходимо отключить некоторые кнопки(к примеру Виндовс или Alt+F4 или капс) на тот момент пока программа работает. Нуджно разрешить нажатие только трех кнопок. лево, право, пробел. При нажатии этих кнопок, должна быть нажата кнопка в программе. Остальные кнопки виндовс должен игнорировать.

подскажите!!!

Ответить

  Ответы Всего ответов: 11  

Номер ответа: 1
Автор ответа:
 Kardinal



ICQ: 360041513 

Вопросов: 1
Ответов: 164
 Web-сайт: kg7.ru
 Профиль | | #1
Добавлено: 10.12.08 18:49
На форме выставить keypreview=true, при возникновении события нажатия кнопки- очищать значение клавишь, а на нужные реагировать.

Ответить

Номер ответа: 2
Автор ответа:
 Kardinal



ICQ: 360041513 

Вопросов: 1
Ответов: 164
 Web-сайт: kg7.ru
 Профиль | | #2
Добавлено: 10.12.08 18:51
Такой пример хорош если реакция винды на клавиши не критична.

Ответить

Номер ответа: 3
Автор ответа:
 Фенягz



ICQ: 387437448 

Вопросов: 7
Ответов: 202
 Web-сайт: atauenis.narod.ru/
 Профиль | | #3
Добавлено: 10.12.08 20:01
Ээм... Тут гдето была тема про это... :-/

Ответить

Номер ответа: 4
Автор ответа:
 Father



Вопросов: 0
Ответов: 159
 Профиль | | #4 Добавлено: 10.12.08 20:33
Не понятно, ты хочешь заблокировать клаву для всех процессов в системе? Это так важно для логики твоей программы!?
Реализовать то можно, но нужно ли?

Ответить

Номер ответа: 5
Автор ответа:
 Father



Вопросов: 0
Ответов: 159
 Профиль | | #5 Добавлено: 10.12.08 21:08
Ладно, уговорил, отключим левый вин в системе.
  1. Option Explicit
  2.  
  3. Private Sub Form_Load()
  4.     hHook = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf LowLevelKeyboardProc, App.hInstance, 0)
  5. End Sub
  6.  
  7. Private Sub Form_Unload(Cancel As Integer)
  8.     UnhookWindowsHookEx hHook
  9. End Sub
  10. '-------- module1
  11. Option Explicit
  12. Public Const WM_KEYDOWN = &H100
  13. Public Const WH_KEYBOARD_LL = 13
  14.  
  15. Public Type KBDLLHOOKSTRUCT
  16.     vkCode As Long
  17.     scanCode As Long
  18.     flags As Long
  19.     time As Long
  20.     dwExtraInfo As Long
  21. End Type
  22.  
  23. 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
  24. Public Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long
  25. Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
  26. Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
  27.  
  28. Public hHook As Long
  29.  
  30. Public Function LowLevelKeyboardProc(ByVal ncode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  31.     Dim kbstruct As KBDLLHOOKSTRUCT
  32.     If ncode < 0 Then
  33.         LowLevelKeyboardProc = CallNextHookEx(hHook, ncode, wParam, lParam)
  34.         Exit Function
  35.     End If
  36.     CopyMemory kbstruct, ByVal lParam, LenB(kbstruct)
  37.     Select Case wParam
  38.     Case WM_KEYDOWN
  39.          If kbstruct.vkCode = 91 Then ' VK_LWIN
  40.             LowLevelKeyboardProc = 1
  41.           Exit Function
  42.          End If
  43.     End Select
  44.     LowLevelKeyboardProc = CallNextHookEx(hHook, ncode, wParam, lParam)
  45. End Function
  46.  
  47.  

Ответить

Номер ответа: 6
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #6
Добавлено: 12.12.08 20:44
Father, этот код не будет работать. Только для текущего потока, да и то периодически будет валиться, так как для глобальных хуков функция обратного вызова должна быть обязательно в расшариваемой секции динамической библиотеки.
http://msdn.microsoft.com/en-us/library/ms644990(VS.85).aspx
Смотри ремарки.

Ответить

Номер ответа: 7
Автор ответа:
 Father



Вопросов: 0
Ответов: 159
 Профиль | | #7 Добавлено: 12.12.08 21:41
Дружище, Executioner, WH_KEYBOARD_LL то самое счастливое исключение, смотри там же в msdn.
код не будет работать
Так проверь.

Ответить

Номер ответа: 8
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #8
Добавлено: 12.12.08 21:55
Да что мне проверять, то. Скинь-ка цитату из MSDN, где написано, что WH_KEYBOARD_LL это то самое счастливое исключение.
Зато там написано, что процедура вызывается в контексте установившего хук потока, посредством отправки потокового сообщения, которые в твоем коде не обрабатываются. Код может и будет работать, но не всегда и не у всех.

Ответить

Номер ответа: 9
Автор ответа:
 Father



Вопросов: 0
Ответов: 159
 Профиль | | #9 Добавлено: 12.12.08 22:23
Похоже ты не корректно перевел msdn. Попробуй еще раз вот эту фразу.

However, the WH_KEYBOARD_LL hook is not injected into another process. Instead, the context switches back to the process that installed the hook and it is called in its original context. Then the context switches back to the application that generated the event.
которые в твоем коде не обрабатываются
Что ты хотел видеть, GetMessage? :)

Ответить

Номер ответа: 10
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #10
Добавлено: 12.12.08 23:11
Сорри, что-то я не спалил это предложение совсем =)

Ответить

Номер ответа: 11
Автор ответа:
 Father



Вопросов: 0
Ответов: 159
 Профиль | | #11 Добавлено: 12.12.08 23:50
Хук WH_KEYBOARD_LL не инжектируется в другой процесс. Вместо этого, контекст переключается обратно на процесс, который устанавливал хук, и в нем вызывает свой оригинальный контекст. Затем контекст переключается обратно на приложение, которое сгенерировало событие.

Я осведомлен о том, что все остальные хуки, для нормальной работы в глобальной видимости требуют, как ты и сказал, library-defined callback function. Но я проверял, и WH_KEYBOARD_LL, WH_MOUSE_LL - исключения.
Работает, правда только на семействе NT, и не все комбинации клавиш можно перехватить, но в жизни вообще мало что универсально.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам