Detecting a Touchscreen in Visual Basic

Introduction

In this day and age, it is critical to know on which platform your application is run. Today, I will show you how to check if your application is running on a touchable device.

Detecting Touch

There are a few ways to detect touch events in your non-UWP applications. Non-UWP applications are not Universal apps. UWP has its own ways and means of identifying which devices your applications are run on. I am talking about ordinary Windows applications here. I will demonstrate two methods of detecting a touchscreen in your program.

With both methods that I will show you today, one Windows API is involved. This API is named GetSystemMetrics. The GetSystemMetrics API function retrieves various system metrics (widths and heights of Windows display elements) and system configuration settings. System metrics are the dimensions (widths and heights) of Windows display elements. All dimensions retrieved by GetSystemMetrics are in pixels.

Our Project

Design your project as per Figure 1.

Our Design
Figure 1: Our Design

Add the GetSystemMetrics API with its associated Constants:

   Public Declare Auto Function GetSystemMetrics Lib _
      "user32.dll" (ByVal smIndex As Integer) As Integer

   Const SM_MAXIMUMTOUCHES As Integer = 95
   Const SM_DIGITIZER As Integer = 94
   Const NID_READY As Integer = 128

SM_MAXIMUMTOUCHES returns the maximum number of contacts supported by each digitizer in the system. If the system has only single-touch digitizers, the return value will be 1. If the system has multi-touch digitizers, the return value is the number of simultaneous contacts the hardware can provide.

The SM_DIGITIZER setting specifies the type of digitizers that are installed on a device. NID_READY identifies if the device is ready to receive digitizer input.

Add the two functions that check if you have a touch-enabled screen:

   Public Function TouchScreen1() As Boolean

      Dim intTouch As Integer

      intTouch = GetSystemMetrics(SM_MAXIMUMTOUCHES)

      Return intTouch > 0

   End Function

   Private Function TouchScreen2() As Boolean

      Return GetSystemMetrics(SM_DIGITIZER) And NID_READY

   End Function

The TouchScreen1 Function returns the number of touch-enabled devices. The TouchScreen2 function returns true or false, depending on whether or not your device is touch-enabled.

The following code creates an onscreen keyboard. I decided to include it in this project because touchscreens are quite common in kiosks. Add the CreateKeyboard sub:

   Private Sub CreateKeyBoard()

      Dim btnAlpha As Button

      Dim intLeft As Integer = 10
      Dim intTop As Integer = 60

      For i As Integer = Asc("A") To Asc("Z")

         ' The following code creates the alphabetic '
         ' keypad, as shown in Figure 2 '
         btnAlpha = New Button

         With btnAlpha

            .Name = "btnAlpha_" & Chr(i)
            .Text = "&" & Chr(i)

            .Size = New Size(25, 25)
            .Location = New Point(intLeft, intTop)

            .Tag = Chr(i)

            intLeft = intLeft + 20

            If Chr(i) = "M" Then

               intTop = intTop + 30
               intLeft = 10

            End If

            .Visible = True

         End With

         Me.Controls.Add(btnAlpha)

      Next

      Dim btnNum As Button

      intLeft = 10
      intTop = 60

      For j As Integer = 0 To 9

         ' The following code creates the numeric '
         ' keypad, as shown in Figure 3 '
         btnNum = New Button

         With btnNum

            .Name = "btnNum_" & j
            .Text = "&" & j

            .Size = New Size(25, 25)
            .Location = New Point(intLeft, intTop)

            .Tag = j

            intLeft = intLeft + 20

            .Visible = True

         End With

         Me.Controls.Add(btnNum)

      Next

   End Sub

Letters
Figure 2: Letters

Numbers
Figure 3: Numbers

First, I created a new button object named btnAlpha. This button or buttons will be placed on the form and will hold all the letters of the alphabet. Next, I created two objects to hold the first button’s location (in pixels), and later on I will manipulate the left and top objects to put the buttons next to each other. I then made use of a with structure to set the dynamic button’s Name, Text, Size, Location, and Tag properties inside the For loop.

When the character M is reached, the characters must continue under the previous 13 buttons. I then set the Visible property to true, added the dynamic button to the form, and created an event handler for when the particular button is clicked. Lastly, I added the number buttons. I won’t go into too many details here because I have written a more complete and more advanced Onscreen keyboard, which you are welcome to look at.

Add the last event:

   Private Sub Form1_Load(sender As Object, _
         e As EventArgs) Handles Me.Load

      If TouchScreen1() Then

         CreateKeyBoard()

      End If

      If TouchScreen2() Then

         CreateKeyBoard()

      End If

   End Sub

You do not have to run both tests. The preceding code in the Form_Load event is just an example of the implementation of both methods.

Download the Code

Below this article, you’ll find a link to download the code that accompanies this article. Please feel free to use it.

Conclusion

Detecting touchscreens is an important trick to know, especially today, when there are so many different Windows Operating Systems and devices.

Hannes DuPreez
Hannes DuPreez
Ockert J. du Preez is a passionate coder and always willing to learn. He has written hundreds of developer articles over the years detailing his programming quests and adventures. He has written the following books: Visual Studio 2019 In-Depth (BpB Publications) JavaScript for Gurus (BpB Publications) He was the Technical Editor for Professional C++, 5th Edition (Wiley) He was a Microsoft Most Valuable Professional for .NET (2008–2017).

More by Author

Get the Free Newsletter!

Subscribe to Developer Insider for top news, trends & analysis

Must Read