Глобальный отлов зажатия клавиши на клавиатуре - Visual Basic .NET
Формулировка задачи:
Здравствуйте, мне нужна ваша помощь. Мне нужно чтоб свернутая программа отлавливала моменты нажатия, отжатия и удержания клавиши клавиатуры. Программа должна приглушать звук системы пока клавиша удерживается и возвращать громкость когда я отпускаю клавишу. Реализовал это так:
Код работает нормально. Но за полтора часа программа сожрала около 90 мб памяти. И чем дальше тем больше памяти ей нужно.
Где моя ошибка?
Листинг программы
- Imports CoreAudioApi
- Dim volNow As Double
- Dim volBool As Boolean = False
- Private Declare Function EmptyWorkingSet Lib "psapi.dll" (ByVal hProcess As Integer) As Integer
- <Runtime.InteropServices.DllImport("user32.dll")>
- Public Shared Function GetAsyncKeyState(ByVal vKey As System.Windows.Forms.Keys) As Short
- End Function
- Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer.Tick
- Dim key As Boolean = False
- key = GetAsyncKeyState(Keys.CapsLock)
- Dim devEnum As New MMDeviceEnumerator
- Dim device As MMDevice = devEnum.GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eMultimedia)
- If key = False And volBool = False Then
- volNow = CInt(device.AudioEndpointVolume.MasterVolumeLevelScalar * 100.0F) / 100
- Exit Sub
- End If
- If key = True And volBool = False Then
- device.AudioEndpointVolume.MasterVolumeLevelScalar = CInt(TrackBar.Value) / 100
- Button1.ForeColor = Color.Red
- volBool = True
- Exit Sub
- End If
- If key = False And volBool = True Then
- device.AudioEndpointVolume.MasterVolumeLevelScalar = volNow
- Button1.ForeColor = Color.Black
- volBool = False
- Exit Sub
- End If
- End Sub
Решение задачи: «Глобальный отлов зажатия клавиши на клавиатуре»
textual
Листинг программы
- 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
- Private Declare Auto Function UnregisterHotKey Lib "user32" (ByVal hWnd As IntPtr, ByVal id As Integer) As Boolean
- Private Const WM_HOTKEY As Integer = &H312
- Private Enum Modifiers As Integer
- ALT = &H1
- CONTROL = &H2
- SHIFT = &H4
- WIN = &H8
- End Enum
- Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
- RegisterHotKey(Me.Handle, 8, Nothing, Keys.A)
- RegisterHotKey(Me.Handle, 16, Modifiers.CONTROL, Nothing)
- RegisterHotKey(Me.Handle, 32, Modifiers.CONTROL, Keys.A)
- End Sub
- Private Sub Form1_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
- UnregisterHotKey(Me.Handle, 8)
- UnregisterHotKey(Me.Handle, 16)
- UnregisterHotKey(Me.Handle, 32)
- End Sub
- Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
- MyBase.WndProc(m)
- If (m.Msg = WM_HOTKEY) Then
- Dim keys As String = String.Empty
- Dim hotKeyId As Integer = m.WParam.ToInt32()
- Select Case hotKeyId
- Case 8
- keys = "A"
- Case 16
- keys = "Ctrl"
- Case 32
- keys = "Ctrl+A"
- End Select
- MsgBox("Нажатие: " & keys)
- End If
- End Sub
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д