2015-08-06 17 views
0

Я пробовал искать все это, но не могу найти решения.Как отключить пробел по форме, keypress - VB.NET

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

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

Я хочу отключить использование пробела от обнаруживаемого нажатия клавиши. Есть какой-либо способ сделать это?

+0

Использование KeyHook https://gist.github.com/Stasonix/3181083 – Elshan

+0

Извините, но я новичок в VB, и этот материал чрезвычайно продвинутый, могли бы вы явно указать мне, что мне нужно будет вводить и где? –

ответ

2

я нашел ответ на этот вопрос; для этого вам нужно добавить обработчик события keydown для элемента управления, для которого вы хотите отключить ключ. Затем введите код:

If e.KeyCode = Keys.space Then 
    e.SuppressKeyPress = True 
End If 

Это будет работать с другими клавишами, такими как ввод и другие клавиши. Просто измените "keys." на ключ, который вы хотите отключить/отключить.

+0

Если вы установите для свойства Form.KeyPreview значение True, то вы можете напишите этот код в обработчике события KeyDown Form вместо копирования/вставки его в королевство. –

+0

Да, это также верно, если вы хотите, чтобы он работал по всей форме. Но если вы хотите, чтобы он работал в определенном текстовом поле, это совсем другая история. Хороший совет! –

0

Использовать ключ Механизм крюка.

Пример В VB Here И Here

Пример C# Here и Low-level Windows API hooks from C# to stop unwanted keystrokes

Если вы не знакомы с C# вы можете использовать code converter для, чтобы получить исходный код формы VB, чтобы понять код. но некоторое время не 100% конвертировать.

Полный код

Чтобы использовать этот код: Вставьте CheckBox и TextBox, чтобы Win Form

Public Class Form1 
    Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Integer, ByVal lpfn As LowLevelKeyboardProcDelegate, ByVal hMod As IntPtr, ByVal dwThreadId As Integer) As IntPtr 
    Declare Function UnhookWindowsHookEx Lib "user32" Alias "UnhookWindowsHookEx" (ByVal hHook As IntPtr) As Boolean 
    Declare Function CallNextHookEx Lib "user32" Alias "CallNextHookEx" (ByVal hHook As IntPtr, ByVal nCode As Integer, ByVal wParam As Integer, ByRef lParam As KBDLLHOOKSTRUCT) As Integer 
    Delegate Function LowLevelKeyboardProcDelegate(ByVal nCode As Integer, ByVal wParam As Integer, ByRef lParam As KBDLLHOOKSTRUCT) As Integer 

    Const WH_KEYBOARD_LL As Integer = 13 

    Structure KBDLLHOOKSTRUCT 
     Dim vkCode As Integer 
     Dim scanCode As Integer 
     Dim flags As Integer 
     Dim time As Integer 
     Dim dwExtraInfo As Integer 
    End Structure 

    Dim intLLKey As IntPtr 
    Private Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChanged 
     If CheckBox1.Checked Then 
      intLLKey = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf LowLevelKeyboardProc, IntPtr.Zero, 0) 
     Else 
      UnhookWindowsHookEx(intLLKey) 
     End If 

    End Sub 
    Private Function LowLevelKeyboardProc(ByVal nCode As Integer, ByVal wParam As Integer, ByRef lParam As KBDLLHOOKSTRUCT) As Integer 
     Dim blnEat As Boolean = False 

     Select Case wParam 
      Case 256, 257, 260, 261 
       'Alt+Tab, Alt+Esc, Ctrl+Esc, Windows Key  
       blnEat = ((lParam.vkCode = 9) AndAlso (lParam.flags = 32)) Or _ 
       ((lParam.vkCode = 27) AndAlso (lParam.flags = 32)) Or _ 
       ((lParam.vkCode = 27) AndAlso (lParam.flags = 0)) Or _ 
       ((lParam.vkCode = 91) AndAlso (lParam.flags = 1)) Or _ 
       ((lParam.vkCode = 92) AndAlso (lParam.flags = 1)) Or _ 
       ((lParam.vkCode = 32) AndAlso (lParam.flags = 0)) 'this is the space key code 32 

     End Select 

     If blnEat = True Then 
      Return 1 
     Else 
      Return CallNextHookEx(IntPtr.Zero, nCode, wParam, lParam) 
     End If 
    End Function 

    Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing 
     UnhookWindowsHookEx(intLLKey) 
    End Sub 
End Class 
+0

Действительно не нужно, похоже, немного перебор для такой простой функции, кстати, вы могли отправить ссылку на сайт вместо копии макаронных изделий, по крайней мере, его источник –

Смежные вопросы