Страница: 1 | 
		
		
			
	
		 
		
			
  
    |   | 
    
Вопрос: Отслеживание клавиатуры
     | 
    
Добавлено: 10.12.08 13:38
     | 
      | 
  
		
			
			  
    
      
Автор вопроса:   KreAtoR
       | 
    
    
      
Подскажите функцию, с помощью которой я могу отследить нажатые клавиши. Мне необходимо отключить некоторые кнопки(к примеру Виндовс или Alt+F4 или капс) на тот момент пока программа работает. Нуджно разрешить нажатие только трех кнопок. лево, право, пробел. При нажатии этих кнопок, должна быть нажата кнопка в программе. Остальные кнопки виндовс должен игнорировать.
 
 
подскажите!!!
Ответить
        | 
    
  
		
			
		
		
			
		
	  
	  
	  
	  
	  
    
      
Номер ответа: 5 Автор ответа:
   Father
  
  
  Вопросов: 0 Ответов: 159 
       | 
      
 Профиль |  | #5
       | 
Добавлено:  10.12.08 21:08
       | 
    
    
      
Ладно, уговорил, отключим левый вин в системе.
 
- Option Explicit
  
-  
 
- Private Sub Form_Load()
  
-     hHook = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf LowLevelKeyboardProc, App.hInstance, 0)
  
- End Sub
  
-  
 
- Private Sub Form_Unload(Cancel As Integer)
  
-     UnhookWindowsHookEx hHook
  
- End Sub
  
- Option Explicit
  
- Public Const WM_KEYDOWN = &H100
  
- Public Const WH_KEYBOARD_LL = 13
  
-  
 
- Public Type KBDLLHOOKSTRUCT
  
-     vkCode As Long
  
-     scanCode As Long
  
-     flags As Long
  
-     time As Long
  
-     dwExtraInfo As Long
  
- End Type
  
-  
 
- 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 CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long
  
- Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
  
- Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
  
-  
 
- Public hHook As Long
  
-  
 
- Public Function LowLevelKeyboardProc(ByVal ncode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  
-     Dim kbstruct As KBDLLHOOKSTRUCT
  
-     If ncode < 0 Then
  
-         LowLevelKeyboardProc = CallNextHookEx(hHook, ncode, wParam, lParam)
  
-         Exit Function
  
-     End If
  
-     CopyMemory kbstruct, ByVal lParam, LenB(kbstruct)
  
-     Select Case wParam
  
-     Case WM_KEYDOWN
  
-          If kbstruct.vkCode = 91 Then 
 
-             LowLevelKeyboardProc = 1
  
-           Exit Function
  
-          End If
  
-     End Select
  
-     LowLevelKeyboardProc = CallNextHookEx(hHook, ncode, wParam, lParam)
  
- End Function
  
-  
 
-  
 
 
  
Ответить
        | 
    
  
	  
	  
    
      
Номер ответа: 7 Автор ответа:
   Father
  
  
  Вопросов: 0 Ответов: 159 
       | 
      
 Профиль |  | #7
       | 
Добавлено:  12.12.08 21:41
       | 
    
    
      
Дружище, Executioner, WH_KEYBOARD_LL то самое счастливое исключение, смотри там же в msdn.
 
код не будет работать  Так проверь.
Ответить
        | 
    
  
	  
	  
	  
	  
    
      
Номер ответа: 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 | 
 
		
			Поиск по форуму