* VB-CODE (4)
Tip 66: Disabling Task-Switching with the SetSysModalWindow Function

Created: April 24, 1995

Abstract
When developing an application in Visual Basic®, you may need to
perform a task that should not be interrupted. This article explains
how to use the Windows® application programming interface (API)
SetSysModalWindow and LockInput functions to disable task-switching.

Preventing a User from Switching to Another Application
The Windows® application programming interface (API) SetSysModalWindow
function can be used to prevent a user from switching to a different
Windows-based application while your program is executing. The
ALT+TAB, CTRL+ESC, ALT+F4, and ALT+ESC keystroke combinations will
not bring up the Task Manager or any other application these
keystrokes will simply be ignored. For a discussion of the
SetSysModalWindow function, see "Additional References" below.

In addition, the LockInput function can be used to force all input to
your Visual Basic® application only. No other application will receive
any mouse or keyboard data. The Declare statement for the LockInput
function is as follows (note that it must be typed as a single line
of code):

Declare Function LockInput Lib "User" (ByVal hReserved As Integer,
   ByVal hwndInput As Integer, ByVal fLock As Integer) As Integer

The LockInput function requires three arguments:

hReserved  An integer value that must be set to a value of zero.
hwndInput  An integer value containing the window's handle. This is
           the window that will receive all input.
fLock      An integer value set to TRUE (nonzero) to lock input or
           FALSE (zero) to unlock input.

When your program is terminated, you must use the LockInput function
to restore input to other Windows-based programs. In addition, you
must destroy the system modal window; otherwise the user will not be
able to switch to any other Windows-based applications and will have
to reboot the computer system.

Example Program
The program below shows how you can prevent a user from switching to
another Windows-based application while your program is executing.

 1. Create a new project in Visual Basic. Form1 is created by default.
 2. Set the following properties for Form1:

ClipControls = False
ControlBox = false
MaxButton = False
MinButton = False

 3. Add the following Dim and Declare statements to the General
    Declarations section of Form1 (note that each Declare statement
    must be typed as a single line of code):

Declare Function GetActiveWindow Lib "User" () As Integer
Declare Function SetFocusAPI Lib "User" Alias "SetFocus"
   (ByVal Hwnd As Integer) As Integer
Declare Function SetSysModalWindow Lib "User"
   (ByVal Hwnd As Integer) As Integer
Declare Function LockInput Lib "User"
   (ByVal hReserved As Integer, ByVal hwndInput As Integer,
   ByVal fLock As Integer) As Integer
Dim TopHwnd As Integer

 4. Add the following code to the Form_Load event for Form1:

Sub Form_Load()
  Dim X As Integer
  Show
  DoEvents
  TopHwnd = GetActiveWindow()
  X = SetFocusAPI(TopHwnd)
  X = SetSysModalWindow(TopHwnd)
  X = LockInput(0, TopHwnd, 1)
End Sub

 5. Add the following code to the Form_Unload event for Form1:

Sub Form_Unload(Cancel As Integer)
  X = LockInput(0, TopHwnd, 0)
End Sub

 6. Add a Command Button control to Form1. Command1 is created by
    default. Set its Caption property to "Quit".
 7. Add the following code to the Click event for Command1:

Sub Command1_Click()
    X = LockInput(0, TopHwnd, 0)
    End
End Sub

Additional References
Knowledge Base Q72674. "How to Create a System-Modal Program/Window
in Visual Basic." (Development Library, Knowledge Base and Bug Lists)


Return