Hallo, I need to make in practice a application running in WIN7. This application must read continuously the sound(noise) received from the microphone and, if the level of the sound(noise) is higher that a adjustable value, to activate to display some random files (messages) on the screen and at the same time to deactivate the mouse and the keyboard. To have a adjusted delay and after the delay time to reactivate the mouse and the keyboard.
I succed this but I have a problem: With the command BlockInputBlockInput True all the keys in keyboard are disabled, but if I press AltCtrlDel the BlockInput turn to False (pressing AlyCtrlDel, mouse and keyboard are activated).
What I need to succed is that the user to not be able to interupt the message to all his display.

This is the programm:

Option Explicit

Dim DevHandle As Long
Dim InData(0 To 511) As Byte
Dim Inited As Boolean
Dim MinHeight As Long, MinWidth As Long
Dim lngTempTime
Dim Res
Public data As String
Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)
Private Declare Function BlockInput Lib "user32" (ByVal fBlock As Long) As Long
Public Declare Function timeGetTime Lib "winmm.dll" () As Long

Private Declare Sub keybd_event Lib "user32" (  ByVal bVk As Byte, ByVal bScan As Byte,     ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

        Const KEYEVENTF_KEYUP = &H2
        Const VK_LWIN = &H5B
        Const VK_LALT = &HA4
        Const VK_F4 = &H73

Public Declare Function Beep Lib "kernel32"   (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long

'********** API for Wave Audio ************

Public Type WaveFormatEx

    Channels As Integer
    SamplesPerSec As Long
    AvgBytesPerSec As Long
    BlockAlign As Integer
    BitsPerSample As Integer
    ExtraDataSize As Integer
End Type

Public Type WaveHdr
    lpData As Long
    dwBufferLength As Long
    dwBytesRecorded As Long
    dwUser As Long
    dwFlags As Long
    dwLoops As Long
    lpNext As Long
    Reserved As Long
End Type

Public Type WaveInCaps
    ManufacturerID As Integer
    ProductID As Integer
    DriverVersion As Long
    ProductName(1 To 32) As Byte
    Formats As Long
    Channels As Integer
    Reserved As Integer
End Type

Public Const WAVE_INVALIDFORMAT = &H0&                 'invalid format
Public Const WAVE_FORMAT_1M08 = &H1&                   '11.025 kHz, Mono,   8-bit
Public Const WAVE_FORMAT_1S08 = &H2&                   '11.025 kHz, Stereo, 8-bit
Public Const WAVE_FORMAT_1M16 = &H4&                   '11.025 kHz, Mono,   16-bit
Public Const WAVE_FORMAT_1S16 = &H8&                   '11.025 kHz, Stereo, 16-bit
Public Const WAVE_FORMAT_2M08 = &H10&                  '22.05  kHz, Mono,   8-bit
Public Const WAVE_FORMAT_2S08 = &H20&                  '22.05  kHz, Stereo, 8-bit
Public Const WAVE_FORMAT_2M16 = &H40&                  '22.05  kHz, Mono,   16-bit
Public Const WAVE_FORMAT_2S16 = &H80&                  '22.05  kHz, Stereo, 16-bit
Public Const WAVE_FORMAT_4M08 = &H100&                 '44.1   kHz, Mono,   8-bit
Public Const WAVE_FORMAT_4S08 = &H200&                 '44.1   kHz, Stereo, 8-bit
Public Const WAVE_FORMAT_4M16 = &H400&                 '44.1   kHz, Mono,   16-bit
Public Const WAVE_FORMAT_4S16 = &H800&                 '44.1   kHz, Stereo, 16-bit

Public Const WAVE_FORMAT_PCM = 1

Public Const WHDR_DONE = &H1&
Public Const WHDR_PREPARED = &H2&
Public Const WHDR_BEGINLOOP = &H4&
Public Const WHDR_ENDLOOP = &H8&
Public Const WHDR_INQUEUE = &H10&

Public Const WIM_OPEN = &H3BE
Public Const WIM_CLOSE = &H3BF
Public Const WIM_DATA = &H3C0

Public Declare Function waveInAddBuffer Lib "winmm" (ByVal InputDeviceHandle As Long, ByVal WaveHdrPointer As Long, ByVal WaveHdrStructSize As Long) As Long
Public Declare Function waveInPrepareHeader Lib "winmm" (ByVal InputDeviceHandle As Long, ByVal WaveHdrPointer As Long, ByVal WaveHdrStructSize As Long) As Long
Public Declare Function waveInUnprepareHeader Lib "winmm" (ByVal InputDeviceHandle As Long, ByVal WaveHdrPointer As Long, ByVal WaveHdrStructSize As Long) As Long

Public Declare Function waveInGetNumDevs Lib "winmm" () As Long
Public Declare Function waveInGetDevCaps Lib "winmm" Alias "waveInGetDevCapsA" (ByVal uDeviceID As Long, ByVal WaveInCapsPointer As Long, ByVal WaveInCapsStructSize As Long) As Long

Public Declare Function waveInOpen Lib "winmm" (WaveDeviceInputHandle As Long, ByVal WhichDevice As Long, ByVal WaveFormatExPointer As Long, ByVal CallBack As Long, ByVal CallBackInstance As Long, ByVal Flags As Long) As Long
Public Declare Function waveInClose Lib "winmm" (ByVal WaveDeviceInputHandle As Long) As Long

Public Declare Function waveInStart Lib "winmm" (ByVal WaveDeviceInputHandle As Long) As Long
Public Declare Function waveInReset Lib "winmm" (ByVal WaveDeviceInputHandle As Long) As Long
Public Declare Function waveInStop Lib "winmm" (ByVal WaveDeviceInputHandle As Long) As Long

Public Sub Main()
    Dim ret As Long
    Dim Wave As WaveHdr
    Dim i As Long
    Dim WaveFormat As WaveFormatEx

   With WaveFormat
      .FormatTag = WAVE_FORMAT_PCM
      .Channels = 2
      .SamplesPerSec = 11025 '11khz
      .BitsPerSample = 8
      .BlockAlign = (.Channels * .BitsPerSample) \ 8
      .AvgBytesPerSec = .BlockAlign * .SamplesPerSec
      .ExtraDataSize = 0
   End With

   ret = waveInOpen(DevHandle, 0, VarPtr(WaveFormat), 0, 0, 0)
   ret = waveInStart(DevHandle)

    Wave.lpData = VarPtr(InData(0))
    Wave.dwBufferLength = 512

   Do
     ret = waveInPrepareHeader(DevHandle, VarPtr(Wave), Len(Wave))
     ret = waveInAddBuffer(DevHandle, VarPtr(Wave), Len(Wave))
     Do
        lngTempTime = timeGetTime
        Do Until timeGetTime > lngTempTime + 100   'loop until 100mS has elapsed
        Loop
     Loop Until ((Wave.dwFlags And WHDR_DONE) = WHDR_DONE) Or DevHandle = 0
     ret = waveInUnprepareHeader(DevHandle, VarPtr(Wave), Len(Wave))

** 'Start program message
If InData(0) > 130 Then
BlockInput True 'block the mouse and keyboard input
Call MinimizeWindows
Sleep 1000 ' wait for 1 seconds
Beep 880, 2000
Res = Shell("Explorer.exe " & "C:\Silence" & RandomInteger(1, 3) & ".ppsx", vbHide)
Sleep 66000 ' wait for 66 seconds
Call CloseWindow
BlockInput False 'unblock the mouse and keyboard input
End If**
DoEvents 'allow windows to update the gui.
Loop While DevHandle <> 0 'While the audio device is open
End Sub

Private Sub MinimizeWindows()
         Call keybd_event(VK_LWIN, 0, 0, 0)
         Call keybd_event(77, 0, 0, 0)    ' 77 is code for the letter 'M'
         Call keybd_event(77, 0, KEYEVENTF_KEYUP, 0)
         Call keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP, 0)
      End Sub

Private Sub CloseWindow()
         Call keybd_event(VK_LALT, 0, 0, 0)
         Call keybd_event(VK_F4, 0, 0, 0)
         Call keybd_event(VK_F4, 0, KEYEVENTF_KEYUP, 0)
         Call keybd_event(VK_LALT, 0, KEYEVENTF_KEYUP, 0)
      End Sub

Private Function RandomInteger(Lowerbound As Integer, Upperbound As Integer) As Integer
    RandomInteger = Int((Upperbound - Lowerbound + 1) * Rnd + Lowerbound)
End Function

Edited 1 Year Ago by tanidani

Ctrl+Alt+Del is a system event and cannot be blocked (though it could be blocked in Vista by modifying the registry). This event is handled in msgina.dll. To disable Ctrl-Alt-Del, you need to write your own msgina.dll. The idea is to pass everything through to msgina.dll except for when Ctrl-Alt-Del is handled.

This article has been dead for over six months. Start a new discussion instead.