Working with Windows 8.1 Control Panel Applets

Introduction

I’ve always been intrigued by the Control Panel; what are those items in the Control Panel? Are they programs? What makes them appear? With this article, I will show you how to run all the various Control Panel applets from your own program.

Control Panel Applets Explained

Control Panel Applets are special purpose Dynamic Link Libraries (DLLs) that let users configure the environment of Microsoft Windows.

The primary responsibility of any Control Panel Applet is to display a window (typically a dialog box or property sheet) and to carry out any tasks specified by the user. Despite this responsibility, Control Panel Applets do not provide menus or other direct means for users to access their dialog boxes. Instead, these applications operate under the control of another application and launch their subprograms only when requested by the controlling application.

Behind the Scenes in Executing these Applets

To open or run these applets, we could use a Windows utility named RunDll32. RunDll32 enables you to call functions exported from a 32-bit DLL. These functions must have the following syntax:

void CALLBACK EntryPoint(
   HWND hwnd,        // handle to owner window
   HINSTANCE hinst,  // instance handle for the DLL
   LPTSTR lpCmdLine, // string the DLL will parse
   int nCmdShow      // show state
);

Now, I’m not going to go into the details of the physical contents these files need to have, but I’m just quickly going to explain how the RunDll32 utility works. Rundll32 loads the specified DLL using LoadLibrary, obtains the address of the function using the GetProcAddress function, and calls the function with the specified arguments, if any. When the function returns, Rundll32 unloads the DLL and exits.

It is possible to create a Unicode version of the function. Rundll32 first tries to find a function named EntryPointW. If it cannot find this function, it tries EntryPointA, then EntryPoint.

Executing the Control Panel Applets

To make use of the RunDll32 utility in our program, we need to have a look at the Process class. This class provides access to local and remote processes and enables you to start and stop local system processes.

A Process object provides access to a process that is running on a computer. A process, in the simplest terms, is a running application. A thread is the basic unit to which the operating system allocates processor time.

To start a Process, we can use the Start method from the Process class; we can also include the StartInfo parameter that can be used to duplicate the functionality of the Run dialog box of the Windows Start menu.

Our Project

Design your VB Windows Form application to resemble Figure 1.

ConPanApp
Figure 1: Our design

Running the Add or Remove Programs

Private Sub btnAddRemoveProgs_Click(ByVal sender As System.Object, _
   ByVal e As System.EventArgs) Handles btnAddRemoveProgs.Click

   'add & remove programs
   Process.Start("rundll32.exe", _
      "shell32.dll,Control_RunDLL appwiz.cpl,,1")

End Sub

Running the Date & Time Settings

Private Sub btnDateTime_Click(ByVal sender As System.Object, _
   ByVal e As System.EventArgs) Handles btnDateTime.Click

   'date & time
   Process.Start("rundll32.exe", _
      "shell32.dll,Control_RunDLL timedate.cpl,,1")

End Sub

Running the Display

Private Sub btnDisplay_Click(ByVal sender As System.Object, _
   ByVal e As System.EventArgs) Handles btnDisplay.Click

   'display
    Process.Start("rundll32.exe", _
      "shell32.dll,Control_RunDLL desk.cpl,,1")
End Sub

Running the Game Controls

Private Sub btnGame_Click(ByVal sender As System.Object, _
   ByVal e As System.EventArgs) Handles btnGame.Click

   'game controllers
   Process.Start("rundll32.exe", _
      "shell32.dll,Control_RunDLL joy.cpl")
End Sub

With this applet, there aren’t any additional tabs.

Running the Internet Options

Private Sub btnInternet_Click(ByVal sender As System.Object, _
   ByVal e As System.EventArgs) Handles btnInternet.Click

   'internet options
   Process.Start("rundll32.exe", _
      "shell32.dll,Control_RunDLL inetcpl.cpl,,1")
End Sub

Running the Keyboard

Private Sub btnKeyboard_Click(ByVal sender As System.Object, _
   ByVal e As System.EventArgs) Handles btnKeyboard.Click

   'keyboard
   Process.Start("rundll32.exe", _
     "shell32.dll,Control_RunDLL main.cpl,@1,1")
End Sub

Running the Mouse

Private Sub btnMouse_Click(ByVal sender As System.Object, _
   ByVal e As System.EventArgs) Handles btnMouse.Click

   'mouse
   Process.Start("rundll32.exe", _
       "shell32.dll,Control_RunDLL main.cpl,@0,1")
End Sub

Running the System

Private Sub btnSystem_Click(ByVal sender As System.Object, _
   ByVal e As System.EventArgs) Handles btnSystem.Click

   'system
   Process.Start("rundll32.exe", _
      "shell32.dll,Control_RunDLL sysdm.cpl,@1,1")
End Sub

Running the Sounds and Audio

Private Sub btnSounds_Click(ByVal sender As System.Object, _
   ByVal e As System.EventArgs) Handles btnSounds.Click

    'sounds & audio
   Process.Start("rundll32.exe", _
      "shell32.dll,Control_RunDLL mmsys.cpl,,1")
End Sub

Running the Add Printer Wizard

Private Sub btnPrinters_Click(ByVal sender As System.Object, _
   ByVal e As System.EventArgs) Handles btnPrinters.Click

   'open add printer wizard
   Process.Start("rundll32.exe", _
      "shell32.dll,SHHelpShortcuts_RunDLL AddPrinter")
End Sub

Here, we used SHHelpShortcuts_RunDLL as the Entrypoint in the shell32.dll.

Running the Regional and Language Options

Private Sub btnRegional_Click(ByVal sender As System.Object, _
   ByVal e As System.EventArgs) Handles btnRegional.Click

   'regional settings
   Process.Start("rundll32.exe", _
      "shell32.dll,Control_RunDLL intl.cpl,,1")
End Sub

Running the Taskbar and Start Menu

Private Sub btnTaskbarStart_Click(ByVal sender As System.Object, _
   ByVal e As System.EventArgs) Handles btnTaskbarStart.Click

   'taskbar & start menu
   Process.Start("rundll32.exe", _
      "shell32.dll,Options_RunDLL 1")
End Sub

Here, we used Options_RunDLL as the Entrypoint.

Opening the Folder Options dialog

Private Sub btnFolder_Click(ByVal sender As System.Object, _
   ByVal e As System.EventArgs) Handles btnFolder.Click

   'folder options
   Process.Start("rundll32.exe", _
      "shell32.dll,Options_RunDLL 0")
End Sub

We also used Options_RunDLL here as our Entrypoint, but this time, we passed 0 to it.

Opening the Control Panel

Private Sub btnControl_Click(ByVal sender As System.Object, _
   ByVal e As System.EventArgs) Handles btnControl.Click

   'open the control panel
   Process.Start("rundll32.exe", _
      "shell32.dll,Control_RunDLL")
End Sub

Just using the Control_RunDLL Entrypoint, without any arguments, opens the Control Panel.

Running the Power Settings

Private Sub btnPower_Click(ByVal sender As System.Object, _
   ByVal e As System.EventArgs) Handles btnPower.Click

   'power settings
   Process.Start("rundll32.exe", _
      "shell32.dll,Control_RunDLL powercfg.cpl")
End Sub

Running the Add Hardware Wizard

Private Sub btnHardware_Click(ByVal sender As System.Object, _
   ByVal e As System.EventArgs) Handles btnHardware.Click

   'add hardware wizard
   Process.Start("rundll32.exe", _
      "shell32.dll,Control_RunDLL hdwwiz.cpl")
End Sub

Opening the Fonts folder

Private Sub btnFonts_Click(ByVal sender As System.Object, _
   ByVal e As System.EventArgs) Handles btnFonts.Click

   'open the fonts folder
   Process.Start("RUNDLL32.EXE", _
   "shell32.dll,SHHelpShortcuts_RunDLL FontsFolder")
End Sub

We used SHHelpShortcuts_RunDLL as the Entrypoint into shell32.dll again (just as we did when opening the Add Printer Wizard earlier). This time, however, we passed FontsFolder to the function.

Opening the Administrative Tools folder

Private Sub btnAdminTools_Click(ByVal sender As System.Object, _
   ByVal e As System.EventArgs) Handles btnAdminTools.Click

   'administration tools
   Process.Start("control.exe", _
      "admintools")
End Sub

This time, we didn’t run RunDll32.exe at all, but Control.exe instead. Control.exe is another utility, included with Windows®, that also can run Control Panel applets. The nice thing about Control.exe is that it recognises special names for commonly used Control Panel items. This means we can execute an item such as AdminTools just by using its special name, instead of the corresponding .cpl file.

Running the Windows Firewall

Private Sub btnFirewall_Click(ByVal sender As System.Object, _
   ByVal e As System.EventArgs) Handles btnFirewall.Click

   'firewall settings
   Process.Start("RunDll32.exe", _
      "shell32.dll,Control_RunDLL firewall.cpl")
End Sub

Running Automatic Updates

Private Sub btnUpdates_Click(ByVal sender As System.Object, _
   ByVal e As System.EventArgs) Handles btnUpdates.Click

   'Automatic updates
   Process.Start("RunDll32.exe", _
      "shell32.dll,Control_RunDLL wuaucpl.cpl")
End Sub

Opening the Network Connections folder

Private Sub btnNetworkConn_Click(ByVal sender As System.Object, _
   ByVal e As System.EventArgs) Handles btnNetworkConn.Click

   'network connections
   Process.Start("RunDll32.exe", _
      "shell32.dll,Control_RunDLL ncpa.cpl")
End Sub

Opening User Accounts

Private Sub btnUsers_Click(ByVal sender As System.Object, _
   ByVal e As System.EventArgs) Handles btnUsers.Click

   'users
   Process.Start("RunDll32.exe", _
      "shell32.dll,Control_RunDLL nusrmgr.cpl")
End Sub

Opening the Scheduled Tasks folder

Private Sub btnTasks_Click(ByVal sender As System.Object, _
   ByVal e As System.EventArgs) Handles btnTasks.Click

'scheduled tasks
   Process.Start("control.exe", _
      "schedtasks")
End Sub

Running the Security Center

Private Sub btnSecurity_Click(ByVal sender As System.Object, _
   ByVal e As System.EventArgs) Handles btnSecurity.Click

   'security settings
   Process.Start("RunDll32.exe", _
      "shell32.dll,Control_RunDLL wscui.cpl")
End Sub

Opening the ODBC Data Source Administrator

Private Sub btnODBC_Click(ByVal sender As System.Object, _
   ByVal e As System.EventArgs) Handles btnODBC.Click

   'Open ODBC dialog box
   Process.Start("RunDll32.exe", _
      "shell32.dll,Control_RunDLL odbccp32.cpl")
End Sub

Opening Opens With

Private Sub btnOpenWith_Click(ByVal sender As System.Object, _
   ByVal e As System.EventArgs) Handles btnOpenWith.Click

   'Opens the Open With dialog box (the dialog box when
   'you right-click a file, and select Open With)
   Process.Start("RunDll32.exe", _
      "shell32.dll,OpenAs_RunDLL test.abd")
End Sub

This is actually quite handy when you have to set File Associations for unknown file types on the system. In the preceding example, I’ve use a filename of test with an .abd extension, with the use of executing this box from within our program, we can set up the necessary file association. I also made use of the OpenAs Entrypoint into Shell32.dll.

Opening Safely Remove Hardware

Private Sub btnSafe_Click(ByVal sender As System.Object, _
   ByVal e As System.EventArgs) Handles btnSafe.Click


   'Opens the Safely remove Hardware dialog, to remove,
   'for example, your USB stick
   Process.Start("RunDll32.exe", _
      "shell32.DLL,Control_RunDLL HotPlug.dll")
End Sub

With the preceding code, I used the Control_RunDLL Entrypoint, to run the DLL file named HotPlug.dll. This produces the Safely Remove Hardware dialog box.

Conclusion

I hope you have enjoyed reading this article!

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