Глобальный отлов зажатия клавиши на клавиатуре - Visual Basic .NET

Узнай цену своей работы

Формулировка задачи:

Здравствуйте, мне нужна ваша помощь. Мне нужно чтоб свернутая программа отлавливала моменты нажатия, отжатия и удержания клавиши клавиатуры. Программа должна приглушать звук системы пока клавиша удерживается и возвращать громкость когда я отпускаю клавишу. Реализовал это так:
Листинг программы
  1. Imports CoreAudioApi
  2. Dim volNow As Double
  3. Dim volBool As Boolean = False
  4. Private Declare Function EmptyWorkingSet Lib "psapi.dll" (ByVal hProcess As Integer) As Integer
  5. <Runtime.InteropServices.DllImport("user32.dll")>
  6. Public Shared Function GetAsyncKeyState(ByVal vKey As System.Windows.Forms.Keys) As Short
  7. End Function
  8. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer.Tick
  9. Dim key As Boolean = False
  10. key = GetAsyncKeyState(Keys.CapsLock)
  11. Dim devEnum As New MMDeviceEnumerator
  12. Dim device As MMDevice = devEnum.GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eMultimedia)
  13. If key = False And volBool = False Then
  14. volNow = CInt(device.AudioEndpointVolume.MasterVolumeLevelScalar * 100.0F) / 100
  15. Exit Sub
  16. End If
  17. If key = True And volBool = False Then
  18. device.AudioEndpointVolume.MasterVolumeLevelScalar = CInt(TrackBar.Value) / 100
  19. Button1.ForeColor = Color.Red
  20. volBool = True
  21. Exit Sub
  22. End If
  23. If key = False And volBool = True Then
  24. device.AudioEndpointVolume.MasterVolumeLevelScalar = volNow
  25. Button1.ForeColor = Color.Black
  26. volBool = False
  27. Exit Sub
  28. End If
  29. End Sub
Код работает нормально. Но за полтора часа программа сожрала около 90 мб памяти. И чем дальше тем больше памяти ей нужно. Где моя ошибка?

Решение задачи: «Глобальный отлов зажатия клавиши на клавиатуре»

textual
Листинг программы
  1.     Private Declare Auto Function RegisterHotKey Lib "user32" (ByVal hWnd As IntPtr, ByVal id As Integer, ByVal fsModifiers As Integer, ByVal vk As Integer) As Boolean
  2.     Private Declare Auto Function UnregisterHotKey Lib "user32" (ByVal hWnd As IntPtr, ByVal id As Integer) As Boolean
  3.  
  4.     Private Const WM_HOTKEY As Integer = &H312
  5.     Private Enum Modifiers As Integer
  6.         ALT = &H1
  7.         CONTROL = &H2
  8.         SHIFT = &H4
  9.         WIN = &H8
  10.     End Enum
  11.  
  12.     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  13.         RegisterHotKey(Me.Handle, 8, Nothing, Keys.A)
  14.         RegisterHotKey(Me.Handle, 16, Modifiers.CONTROL, Nothing)
  15.         RegisterHotKey(Me.Handle, 32, Modifiers.CONTROL, Keys.A)
  16.     End Sub
  17.     Private Sub Form1_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
  18.         UnregisterHotKey(Me.Handle, 8)
  19.         UnregisterHotKey(Me.Handle, 16)
  20.         UnregisterHotKey(Me.Handle, 32)
  21.     End Sub
  22.  
  23.     Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
  24.         MyBase.WndProc(m)
  25.         If (m.Msg = WM_HOTKEY) Then
  26.  
  27.             Dim keys As String = String.Empty
  28.             Dim hotKeyId As Integer = m.WParam.ToInt32()
  29.             Select Case hotKeyId
  30.                 Case 8
  31.                     keys = "A"
  32.  
  33.                 Case 16
  34.                     keys = "Ctrl"
  35.  
  36.                 Case 32
  37.                     keys = "Ctrl+A"
  38.  
  39.             End Select
  40.             MsgBox("Нажатие: " & keys)
  41.         End If
  42.     End Sub

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы