dcsimg
 

Obtaining Computer Information with Visual Basic.NET

Friday Dec 22nd 2017 by Hannes DuPreez

Discover and implement several ways to obtain information about your computer during runtime.

The .NET Framework provides numerous ways to obtain system information. Visual Basic.NET makes it even easier, but the ultimate power still lies within Windows itself, as you will soon see. Today, you will learn several ways to obtain information about your computer during runtime.

The ComputerInfo Class

The ComputerInfo class provides various properties for getting information about the computer's Operating System, memory, name, and loaded assemblies. The ComputerInfo class has the following Properties:

  • AvailablePhysicalMemory: Gets the amount of free physical memory.
  • AvailableVirtualMemory: Gets the amount of free virtual memory.
  • InstalledUICulture: Gets the current UI culture installed.
  • OSFullName: Gets the full Operating System name.
  • OSPlatform: Gets the platform of the Operating System.
  • OSVersion: Gets the Operating System version.
  • TotalPhysicalMemory: Gets the total physical memory for the computer.
  • TotalVirtualMemory: Gets the total virtual memory available for the computer.
  • System.Management Namespace: Provides access management information and events about the system, devices, and all applications instrumented to the WMI (Windows Management Instrumentation) infrastructure.

Practical

Your practical example today will make use of the ComputerInfo class to get some of the system information. Later, you will make use of the System.Management namespace to get more advanced system information.

Start Visual Studio and create a new Visual Basic Windows Forms application. You may name your project anything you desire, but, as always, keep in mind that my objects might be named differently. Your project will consist of for forms, with the first form having the most interaction. So, let's design the forms one by one as shown next.

Form 1

Design of Form 1
Figure 1: Design of Form 1

Design your other three forms to look similar to Figure 2, of Form 2. It simply contains one Multi-line textbox.

The design of Forms 2-4
Figure 2: The design of Forms 2-4

Add the following code for the button labeled 'Available Physical Memory':

   Private Sub btnAvailablePhysicalMemory_Click(sender As Object, _
         e As EventArgs) Handles btnAvailablePhysicalMemory.Click

      MessageBox.Show("Available Physical Memory: " & _
         My.Computer.Info.AvailablePhysicalMemory)

   End Sub

This code simply displays the amount of physical memory on your computer. Add the following code:

   Private Sub btnAvailableVirtualMemory_Click(sender As Object, _
         e As EventArgs) Handles btnAvailableVirtualMemory.Click

      MessageBox.Show("Available Virtual Memory: " & _
         My.Computer.Info.AvailableVirtualMemory)

   End Sub

   Private Sub btnInstalledUICulture_Click(sender As Object, _
         e As EventArgs) Handles btnInstalledUICulture.Click

      MessageBox.Show("UI Culture Name: " & _
         My.Computer.Info.InstalledUICulture.DisplayName)

   End Sub

   Private Sub btnOSFullName_Click(sender As Object, _
         e As EventArgs) Handles btnOSFullName.Click

      MessageBox.Show("Operating System Name: " & _
         My.Computer.Info.OSFullName)

   End Sub

   Private Sub btnOSPlatform_Click(sender As Object, _
         e As EventArgs) Handles btnOSPlatform.Click

      MessageBox.Show("Operating System Platform: " & _
         My.Computer.Info.OSPlatform)

   End Sub

   Private Sub btnOSVersion_Click(sender As Object, _
         e As EventArgs) Handles btnOSVersion.Click

      MessageBox.Show("Operating System Version: " & _
         My.Computer.Info.OSVersion)

   End Sub

   Private Sub btnTotalPhysicalMemory_Click(sender As Object, _
         e As EventArgs) Handles btnTotalPhysicalMemory.Click

      MessageBox.Show("Available Physical Memory: " & _
         My.Computer.Info.TotalPhysicalMemory)

   End Sub

   Private Sub btnTotalVirtualMemory_Click(sender As Object, _
         e As EventArgs) Handles btnTotalVirtualMemory.Click

      MessageBox.Show("Available Virtual Memory: " & _
         My.Computer.Info.TotalVirtualMemory)

   End Sub

By making use of the ComputerInfo class, you now are able to detect the physical memory, virtual memory, and get basic Operating System details.

The remaining three buttons simply need to load the appropriate form, so let's put those in now:

   Private Sub Button1_Click(sender As Object, e As EventArgs) _
         Handles Button1.Click

      Dim f2 As New Form2

      f2.Show()

   End Sub

   Private Sub Button2_Click(sender As Object, e As EventArgs) _
         Handles Button2.Click

      Dim f3 As New Form3

      f3.Show()

   End Sub

   Private Sub Button3_Click(sender As Object, e As EventArgs) _
         Handles Button3.Click

      Dim f4 As New Form4

      f4.Show()

   End Sub

Each form must show different properties for different aspects of the Operating System. For example: Form 2 should show details that pertain to the Processor, Form 3 has to show information on the Logical Disks, and Form 4 has to show properties and details of the keyboard. All of this is possible through the management namespace and WMI Service Management.

What follows is an alphabetical list of Win32 classes we can tap into:

  • Win32_1394Controller
  • Win32_1394ControllerDevice
  • Win32_AccountSID
  • Win32_ActionCheck
  • Win32_ActiveRoute
  • Win32_AllocatedResource
  • Win32_ApplicationCommandLine
  • Win32_ApplicationService
  • Win32_AssociatedProcessorMemory
  • Win32_AutochkSetting
  • Win32_BaseBoard
  • Win32_Battery
  • Win32_Binary
  • Win32_BindImageAction
  • Win32_BootConfiguration
  • Win32_Bus Win32_CacheMemory
  • Win32_CDROMDrive
  • Win32_CheckCheck
  • Win32_CIMLogicalDeviceCIMDataFile
  • Win32_ClassicCOMApplicationClasses
  • Win32_ClassicCOMClass
  • Win32_ClassicCOMClassSetting
  • Win32_ClassicCOMClassSettings
  • Win32_ClassInforAction
  • Win32_ClientApplicationSetting
  • Win32_CodecFile
  • Win32_COMApplicationSettings
  • Win32_COMClassAutoEmulator
  • Win32_ComClassEmulator
  • Win32_ComponentCategory
  • Win32_ComputerSystem
  • Win32_ComputerSystemProcessor
  • Win32_ComputerSystemProduct
  • Win32_ComputerSystemWindowsProductActivationSetting
  • Win32_Condition
  • Win32_ConnectionShare
  • Win32_ControllerHastHub
  • Win32_CreateFolderAction
  • Win32_CurrentProbe
  • Win32_DCOMApplication
  • Win32_DCOMApplicationAccessAllowedSetting
  • Win32_DCOMApplicationLaunchAllowedSetting
  • Win32_DCOMApplicationSetting
  • Win32_DependentService
  • Win32_Desktop
  • Win32_DeviceBus
  • Win32_DeviceMemoryAddress
  • Win32_Directory
  • Win32_DirectorySpecification
  • Win32_DiskDrive
  • Win32_DiskDrivePhysicalMedia
  • Win32_DiskDriveToDiskPartition
  • Win32_DiskPartition
  • Win32_DiskQuota
  • Win32_DisplayConfiguration
  • Win32_DisplayControllerConfiguration
  • Win32_DMAChanner
  • Win32_DriverForDevice
  • Win32_DuplicateFileAction
  • Win32_Environment
  • Win32_EnvironmentSpecification
  • Win32_ExtensionInfoAction
  • Win32_Fan
  • Win32_FileSpecification
  • Win32_FloppyDrive
  • Win32_FontInfoAction
  • Win32_Group
  • Win32_GroupDomain
  • Win32_GroupUser
  • Win32_HeatPipe
  • Win32_IDEControllerDevice
  • Win32_ImplementedCategory
  • Win32_InfraredDevice
  • Win32_IniFileSpecification
  • Win32_InstalledSoftwareElement
  • Win32_IP4PersistedRouteTable
  • Win32_IP4RouteTable
  • Win32_IRQResource
  • Win32_Keyboard
  • Win32_LaunchCondition
  • Win32_LoadOrderGroupServiceDependencies
  • Win32_LoadOrderGroupServiceMembers
  • Win32_LocalTime
  • Win32_LoggedOnUser
  • Win32_LogicalDisk
  • Win32_LogicalDiskRootDirectory
  • Win32_LogicalDiskToPartition
  • Win32_LogicalFileAuditing
  • Win32_LogicalFileGroup
  • Win32_LogicalFileOwner
  • Win32_LogicalFileSecuritySetting
  • Win32_LogicalProgramGroup
  • Win32_LogicalProgramGroupDirectory
  • Win32_LogicalProgramGroupItem
  • Win32_LogicalProgramGroupItemDataFile
  • Win32_LogicalShareAccess
  • Win32_LogicalShareAuditing
  • Win32_LogicalShareSecuritySetting
  • Win32_LogonSession
  • Win32_MappedLogicalDisk
  • Win32_MemoryArray
  • Win32_MemoryArrayLocation
  • Win32_MemoryDevice
  • Win32_MemoryDeviceArray
  • Win32_MemoryDeviceLocation
  • Win32_MIMEInfoAction
  • Win32_MotherboardDevice
  • Win32_MoveFileAction
  • Win32_NamedJobObjectActgInfo
  • Win32_NamedJobObjectLimit
  • Win32_NamedJobObjectLimitSetting
  • Win32_NamedJobObjectProcess
  • Win32_NamedJobObjectSecLimit
  • Win32_NamedJobObjectSecLimitSetting
  • Win32_NetworkAdapter
  • Win32_NetworkAdapterConfiguration
  • Win32_NetworkAdapterSetting
  • Win32_NetworkClient
  • Win32_NetworkConnection
  • Win32_NetworkLoginProfile
  • Win32_NetworkProtocol
  • Win32_NTDomain
  • Win32_NTLogEvnetLog
  • Win32_NTLogEventUser
  • Win32_ODBCAttribute
  • Win32_ODBCDataSourceAttribute
  • Win32_ODBCDataSourceSpecification
  • Win32_ODBCDriverAttribute
  • Win32_ODBCDriverSoftwareElement
  • Win32_ODBCDriverSpecification
  • Win32_ODBCTranslatorSpecification
  • Win32_OnBoardDevice
  • Win32_OperatingSystem
  • Win32_OperatingSystemAutochkSetting
  • Win32_OperatingSystemQFE
  • Win32_OSRecoveryConfiguración
  • Win32_PageFileElementSetting
  • Win32_PageFileSetting
  • Win32_PageFileUsage
  • Win32_ParallelPort
  • Win32_PatchFile
  • Win32_PatchPackage
  • Win32_PCMCIAControler
  • Win32_PerfFormattedData_ASP_ActiveServerPages
  • Win32_PerfFormattedData_ASPNET_ASPNET
  • Win32_PerfFormattedData_ASPNET_ASPNETApplications
  • Win32_PerfFormattedData_aspnet_state_ASPNETStateService
  • Win32_PerfFormattedData_ContentIndex_IndexingService
  • Win32_PerfFormattedData_DTSPipeline_SQLServerDTSPipeline
  • Win32_PerfFormattedData_Fax_FaxServices
  • Win32_PerfFormattedData_InetInfo_InternetInformationServicesGlobal
  • Win32_PerfFormattedData_ISAPISearch_HttpIndexingService
  • Win32_PerfFormattedData_MSDTC_DistributedTransactionCoordinator
  • Win32_PerfFormattedData_NETCLRData_NETCLRData
  • Win32_PerfFormattedData_NETCLRNetworking_NETCLRNetworking
  • Win32_PerfFormattedData_NETDataProviderforOracle_NETCLRData
  • Win32_PerfFormattedData_NETDataProviderforSqlServer_NETDataProviderforSqlServer
  • Win32_PerfFormattedData_NETFramework_NETCLRExceptions
  • Win32_PerfFormattedData_NETFramework_NETCLRInterop
  • Win32_PerfFormattedData_NETFramework_NETCLRJit
  • Win32_PerfFormattedData_NETFramework_NETCLRRemoting
  • Win32_PerfFormattedData_NETFramework_NETCLRSecurity
  • Win32_PerfFormattedData_Outlook_Outlook
  • Win32_PerfFormattedData_PerfDisk_LogicalDisk
  • Win32_PerfFormattedData_PerfDisk_PhysicalDisk
  • Win32_PerfFormattedData_PerfNet_Browser
  • Win32_PerfFormattedData_PerfNet_Redirector
  • Win32_PerfFormattedData_PerfNet_Server
  • Win32_PerfFormattedData_PerfNet_ServerWorkQueues
  • Win32_PerfFormattedData_PerfOS_Cache
  • Win32_PerfFormattedData_PerfOS_Memory
  • Win32_PerfFormattedData_PerfOS_Objects
  • Win32_PerfFormattedData_PerfOS_Processor
  • Win32_PerfFormattedData_PerfOS_System
  • Win32_PerfFormattedData_PerfProc_FullImage_Costly
  • Win32_PerfFormattedData_PerfProc_Image_Costly
  • Win32_PerfFormattedData_PerfProc_JobObject
  • Win32_PerfFormattedData_PerfProc_JobObjectDetails
  • Win32_PerfFormattedData_PerfProc_Process
  • Win32_PerfFormattedData_PerfProc_ProcessAddressSpace_Costly
  • Win32_PerfFormattedData_PerfProc_Thread
  • Win32_PerfFormattedData_PerfProc_ThreadDetails_Costly
  • Win32_PerfFormattedData_RemoteAccess_RASPort
  • Win32_PerfFormattedData_RemoteAccess_RASTotal
  • Win32_PerfFormattedData_RSVP_RSVPInterfaces
  • Win32_PerfFormattedData_RSVP_RSVPService
  • Win32_PerfFormattedData_Spooler_PrintQueue
  • Win32_PerfFormattedData_TapiSrv_Telephony
  • Win32_PerfFormattedData_Tcpip_ICMP
  • Win32_PerfFormattedData_Tcpip_IP
  • Win32_PerfFormattedData_Tcpip_NetworkInterface
  • Win32_PerfFormattedData_Tcpip_TCP
  • Win32_PerfFormattedData_Tcpip_UDP
  • Win32_PerfFormattedData_TermService_TerminalServices
  • Win32_PerfFormattedData_TermService_TerminalServicesSession
  • Win32_PerfFormattedData_W3SVC_WebService
  • Win32_PerfRawData_ASP_ActiveServerPages
  • Win32_PerfRawData_ASPNET_114322_ASPNETAppsv114322
  • Win32_PerfRawData_ASPNET_114322_ASPNETv114322
  • Win32_PerfRawData_ASPNET_2040607_ASPNETAppsv2040607
  • Win32_PerfRawData_ASPNET_2040607_ASPNETv2040607
  • Win32_PerfRawData_ASPNET_ASPNET
  • Win32_PerfRawData_ASPNET_ASPNETApplications
  • Win32_PerfRawData_aspnet_state_ASPNETStateService
  • Win32_PerfRawData_ContentFilter_IndexingServiceFilter
  • Win32_PerfRawData_ContentIndex_IndexingService
  • Win32_PerfRawData_DTSPipeline_SQLServerDTSPipeline
  • Win32_PerfRawData_InetInfo_InternetInformationServicesGlobal
  • Win32_PerfRawData_ISAPISearch_HttpIndexingService
  • Win32_PerfRawData_MSDTC_DistributedTransactionCoordinator
  • Win32_PerfRawData_NETCLRData_NETCLRData
  • Win32_PerfRawData_NETCLRNetworking_NETCLRNetworking
  • Win32_PerfRawData_NETDataProviderforOracle_NETCLRData
  • Win32_PerfRawData_NETDataProviderforSqlServer_NETDataProviderforSqlServer
  • Win32_PerfRawData_NETFramework_NETCLRExceptions
  • Win32_PerfRawData_NETFramework_NETCLRInterop
  • Win32_PerfRawData_NETFramework_NETCLRJit
  • Win32_PerfRawData_NETFramework_NETCLRLoading
  • Win32_PerfRawData_NETFramework_NETCLRLocksAndThreads
  • Win32_PerfRawData_NETFramework_NETCLRRemoting
  • Win32_PerfRawData_NETFramework_NETCLRSecurity
  • Win32_PerfRawData_NTFSDRV_ControladordealmacenamientoNTFSdeSMTP
  • Win32_PerfRawData_Outlook_Outlook
  • Win32_PerfRawData_PerfDisk_LogicalDisk
  • Win32_PerfRawData_PerfDisk_PhysicalDisk
  • Win32_PerfRawData_PerfNet_Browser
  • Win32_PerfRawData_PerfNet_Redirector
  • Win32_PerfRawData_PerfNet_Server
  • Win32_PerfRawData_PerfNet_ServerWorkQueues
  • Win32_PerfRawData_PerfOS_Cache
  • Win32_PerfRawData_PerfOS_Memory
  • Win32_PerfRawData_PerfOS_Objects
  • Win32_PerfRawData_PerfOS_Processor
  • Win32_PerfRawData_PerfOS_System
  • Win32_PerfRawData_PerfProc_FullImage_Costly
  • Win32_PerfRawData_PerfProc_Image_Costly
  • Win32_PerfRawData_PerfProc_JobObject
  • Win32_PerfRawData_PerfProc_JobObjectDetails
  • Win32_PerfRawData_PerfProc_Process
  • Win32_PerfRawData_PerfProc_ProcessAddressSpace_Costly
  • Win32_PerfRawData_PerfProc_Thread
  • Win32_PerfRawData_PerfProc_ThreadDetails_Costly
  • Win32_PerfRawData_RemoteAccess_RASPort
  • Win32_PerfRawData_RemoteAccess_RASTotal
  • Win32_PerfRawData_RSVP_RSVPInterfaces
  • Win32_PerfRawData_RSVP_RSVPService
  • Win32_PerfRawData_Spooler_PrintQueue
  • Win32_PerfRawData_TapiSrv_Telephony
  • Win32_PerfRawData_Tcpip_ICMP
  • Win32_PerfRawData_Tcpip_IP
  • Win32_PerfRawData_Tcpip_NBTConnection
  • Win32_PerfRawData_Tcpip_NetworkInterface
  • Win32_PerfRawData_Tcpip_TCP
  • Win32_PerfRawData_TermService_TerminalServices
  • Win32_PerfRawData_TermService_TerminalServicesSession
  • Win32_PerfRawData_W3SVC_WebService
  • Win32_PhysicalMedia
  • Win32_PhysicalMemory
  • Win32_PhysicalMemoryArray
  • Win32_PhysicalMemoryLocation
  • Win32_PingStatus
  • Win32_PNPAllocatedResource
  • Win32_PnPDevice
  • Win32_PnPEntity
  • Win32_PnPSignedDriver
  • Win32_PnPSignedDriverCIMDataFile
  • Win32_PointingDevice
  • Win32_PortableBattery
  • Win32_PortResource
  • Win32_POTSModem
  • Win32_POTSModemToSerialPort
  • Win32_Printer
  • Win32_PrinterConfiguration
  • Win32_PrinterController
  • Win32_PrinterDriver
  • Win32_PrinterSetting
  • Win32_PrinterShare
  • Win32_PrintJob
  • Win32_Process
  • Win32_Processor
  • Win32_Product
  • Win32_ProductCheck
  • Win32_ProductResource
  • Win32_ProductSoftwareFeatures
  • Win32_ProgIDSpecification
  • Win32_ProgramGroup
  • Win32_ProgramGroupContents
  • Win32_Property
  • Win32_ProtocolBinding
  • Win32_Proxy
  • Win32_PublishComponentAction
  • Win32_QuickFixEngineering
  • Win32_QuotaSetting
  • Win32_Registry
  • Win32_RegistryAction
  • Win32_RemoveFileAction
  • Win32_RemoveIniAction
  • Win32_ReserveCost
  • Win32_ScheduledJob
  • Win32_SCSIController
  • Win32_SCSIControllerDevice
  • Win32_SecuritySettingOfLogicalShare
  • Win32_SelfRegModuleAction
  • Win32_SerialPort
  • Win32_SerialPortConfiguration
  • Win32_SerialPortSetting
  • Win32_ServerConnection
  • Win32_ServerSession
  • Win32_Service
  • Win32_ServiceControl
  • Win32_ServiceSpecification
  • Win32_ServiceSpecificationService
  • Win32_SessionConnection
  • Win32_SessionProcess
  • Win32_Share
  • Win32_ShareToDirectory
  • Win32_ShortcutAction
  • Win32_ShortcutFile
  • Win32_SID
  • Win32_SoftwareElement
  • Win32_SoftwareElementAction
  • Win32_SoftwareElementCheck
  • Win32_SoftwareElementCondition
  • Win32_SoftwareElementResource
  • Win32_SoftwareFeature
  • Win32_SoftwareFeatureAction
  • Win32_SoftwareFeatureCheck
  • Win32_SoftwareFeatureParent
  • Win32_SoftwareFeatureSoftwareElements
  • Win32_SoundDevice
  • Win32_StartupCommand
  • Win32_SubDirectory
  • Win32_SystemAccount
  • Win32_SystemBIOS
  • Win32_SystemBootConfiguration
  • Win32_SystemDesktop
  • Win32_SystemDriver
  • Win32_SystemDriverPNPEntity
  • Win32_SystemEnclosure
  • Win32_SystemLoadOrderGroups
  • Win32_SystemLogicalMemoryConfiguration
  • Win32_SystemNetworkConnections
  • Win32_SystemOperatingSystem
  • Win32_SystemPartitions
  • Win32_SystemProcesses
  • Win32_SystemProgramGroups
  • Win32_SystemResources
  • Win32_SystemServices
  • Win32_SystemSlot
  • Win32_SystemSystemDriver
  • Win32_SystemTimeZone
  • Win32_SystemUsers
  • Win32_TCPIPPrinterPort
  • Win32_TemperatureProbe
  • Win32_Terminal
  • Win32_TerminalService
  • Win32_TerminalServiceSetting
  • Win32_TerminalServiceToSetting
  • Win32_TerminalTerminalSetting
  • Win32_Thread
  • Win32_TimeZone
  • Win32_TSGeneralSetting
  • Win32_TSNetworkAdapterListSetting
  • Win32_TSNetworkAdapterSetting
  • Win32_TSPermissionsSetting
  • Win32_TSRemoteControlSetting
  • Win32_TSSessionDirectory
  • Win32_TSSessionDirectorySetting
  • Win32_TSSessionSetting
  • Win32_TypeLibraryAction
  • Win32_UninterruptiblePowerSupply
  • Win32_USBController
  • Win32_USBControllerDevice
  • Win32_USBHub
  • Win32_UserAccount
  • Win32_UserDesktop
  • Win32_UserInDomain
  • Win32_UTCTime
  • Win32_VideoController
  • Win32_VideoSettings
  • Win32_VolumeQuotaSetting
  • Win32_WindowsProductActivation
  • Win32_WMIElementSetting
  • Win32_WMISetting

To work with these Wind32 classes, you need to create a Function that can do that. Add a Module and then add the following functions into it:

Imports System.Management
Imports System.Text

Module Module1

   Public Function GetInfo(stringIn As String) As String

      Dim sbOutput As New StringBuilder(String.Empty)

      Try
         Dim mcInfo As New ManagementClass(stringIn)

         Dim mcInfoCol As ManagementObjectCollection = _
            mcInfo.GetInstances()

         Dim pdInfo As PropertyDataCollection = mcInfo.Properties

         For Each objMng As ManagementObject In mcInfoCol

            For Each prop As PropertyData In pdInfo

               Try

                  sbOutput.AppendLine(prop.Name + ":  " + _
                     objMng.Properties(prop.Name).Value)

               Catch

               End Try

            Next

            sbOutput.AppendLine()

         Next

      Catch

      End Try

      Return sbOutput.ToString()

   End Function

End Module

You will notice that the compiler is complaining, so you need to add a Reference to the System.Management namespace as well, by selecting Project, Add reference, select the Framework tab, and select the System.Management namespace, as shown in Figure 3:

Add Reference
Figure 3: Add Reference

The preceding code accumulates all the desired information of the specified Windows32 class, and outputs it as a string. You now need to make use of the function from your remaining forms.

Form 2

Public Class Form2
   Private Sub Form2_Load(sender As Object, e As EventArgs) _
         Handles MyBase.Load

      TextBox1.Text = GetInfo("Win32_Processor")

   End Sub

End Class

Form 3

Public Class Form3
   Private Sub Form3_Load(sender As Object, e As EventArgs) _
         Handles Me.Load

      TextBox1.Text = GetInfo("Win32_LogicalDisk")

   End Sub

End Class

Form 4

Public Class Form4
   Private Sub Form4_Load(sender As Object, e As EventArgs) _
         Handles Me.Load

      TextBox1.Text = GetInfo("Win32_Keyboard")

   End Sub

End Class

Once run, your forms will display the following outputs:

Processor
Figure 4: Processor

Logical Disk
Figure 5: Logical Disk

Keyboard
Figure 6: Keyboard

The code for this article is available on GitHub.

Conclusion

Knowing how to obtain and manipulate information from the Operating system is vital for large applications. Happy playing, and don't break anything!

Home
Mobile Site | Full Site
Copyright 2018 © QuinStreet Inc. All Rights Reserved