DOCUMENT:Q147886 18-FEB-2002 [vbwin] TITLE :HOWTO: How VB Can Get Windows Status Information via API Calls PRODUCT :Microsoft Visual Basic for Windows PROD/VER::4.0,5.0,6.0 OPER/SYS: KEYWORDS:kbAPI kbSDKWin32 kbVBp kbVBp400 kbVBp500 kbVBp600 kbGrpDSVB kbDSupport ====================================================================== ------------------------------------------------------------------------------- The information in this article applies to: - Microsoft Visual Basic Learning Edition for Windows, versions 5.0, 6.0 - Microsoft Visual Basic Professional Edition for Windows, versions 5.0, 6.0 - Microsoft Visual Basic Enterprise Edition for Windows, versions 5.0, 6.0 - Microsoft Visual Basic Standard Edition, 32-bit, for Windows, version 4.0 - Microsoft Visual Basic Professional Edition, 16-bit, for Windows, version 4.0 - Microsoft Visual Basic Professional Edition, 32-bit, for Windows, version 4.0 - Microsoft Visual Basic Enterprise Edition, 16-bit, for Windows, version 4.0 - Microsoft Visual Basic Enterprise Edition, 32-bit, for Windows, version 4.0 ------------------------------------------------------------------------------- SUMMARY ======= The Visual Basic for Windows sample program below demonstrates how you can obtain system status information similar to the information displayed in the Windows Program Manager About box. The sample program displays the following information using the Windows API functions indicated: - The Windows version number with the GetVersion function. - The CPU processor type. - Whether Windows is running in enhanced mode or standard mode on a 16-bit operating system. This does not apply to Microsoft Windows 95 or Microsoft Windows NT. - The amount of free memory. - The percentage of free system resources with SystemHeapInfo on a 16-bit operating system. This does not apply to Microsoft Windows 95 or Microsoft Windows NT. NOTE: The SystemHeapInfo API function is new to Microsoft Windows version 3.1 and is not available in Microsoft Windows, version 3.0. All other API functions listed above are available in both Windows versions 3.0 or 3.1. MORE INFORMATION ================ Steps to Create Example Program ------------------------------- 1. Start a new project in Visual Basic. Form1 is created by default. 2. Add a module to the project. 3. Add the following code to the General Declarations section of Module1: #If Win32 Then Type SYSTEM_INFO dwOemID As Long dwPageSize As Long lpMinimumApplicationAddress As Long lpMaximumApplicationAddress As Long dwActiveProcessorMask As Long dwNumberOrfProcessors As Long dwProcessorType As Long dwAllocationGranularity As Long dwReserved As Long End Type Type OSVERSIONINFO dwOSVersionInfoSize As Long dwMajorVersion As Long dwMinorVersion As Long dwBuildNumber As Long dwPlatformId As Long szCSDVersion As String * 128 End Type Type MEMORYSTATUS dwLength As Long dwMemoryLoad As Long dwTotalPhys As Long dwAvailPhys As Long dwTotalPageFile As Long dwAvailPageFile As Long dwTotalVirtual As Long dwAvailVirtual As Long End Type Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" _ (LpVersionInformation As OSVERSIONINFO) As Long Declare Sub GlobalMemoryStatus Lib "kernel32" (lpBuffer As _ MEMORYSTATUS) Declare Sub GetSystemInfo Lib "kernel32" (lpSystemInfo As _ SYSTEM_INFO) Public Const PROCESSOR_INTEL_386 = 386 Public Const PROCESSOR_INTEL_486 = 486 Public Const PROCESSOR_INTEL_PENTIUM = 586 Public Const PROCESSOR_MIPS_R4000 = 4000 Public Const PROCESSOR_ALPHA_21064 = 21064 #Else ' Constants for GetWinFlags. Global Const WF_CPU286 = &H2 Global Const WF_CPU386 = &H4 Global Const WF_CPU486 = &H8 Global Const WF_80x87 = &H400 Global Const WF_STANDARD = &H10 Global Const WF_ENHANCED = &H20 Global Const WF_WINNT = &H4000 ' Type for SystemHeapInfo. Type SYSHEAPINFO dwSize As Long wUserFreePercent As Integer wGDIFreePercent As Integer hUserSegment As Integer hGDISegment As Integer End Type Declare Function GetVersion Lib "kernel" () As Long Declare Function GetWinFlags Lib "kernel" () As Long 'Enter each of the following Declare statements as one, single line: Declare Function GetFreeSpace Lib "kernel" (ByVal wFlags As Integer)_ As Long Declare Function GlobalCompact Lib "kernel" _ (ByVal dwMinFree As Long) As Long Declare Function SystemHeapInfo Lib "toolhelp.dll" _ (shi As SYSHEAPINFO) As Integer #End If 4. Enter the following code into the Form_Load procedure of Form1: Private Sub Form_Load() Dim msg As String ' Status information. Dim nl As String ' New-line. nl = Chr$(13) + Chr$(10) ' New-line. Show MousePointer = 11 ' Hourglass. #If Win32 Then ' Get operating system and version. Dim verinfo As OSVERSIONINFO verinfo.dwOSVersionInfoSize = Len(verinfo) ret% = GetVersionEx(verinfo) If ret% = 0 Then MsgBox "Error Getting Version Information" End End If Select Case verinfo.dwPlatformId Case 0 msg = msg + "Windows 32s " Case 1 msg = msg + "Windows 95 " Case 2 msg = msg + "Windows NT " End Select ver_major$ = verinfo.dwMajorVersion ver_minor$ = verinfo.dwMinorVersion build$ = verinfo.dwBuildNumber msg = msg + ver_major$ + "." + ver_minor$ msg = msg + " (Build " + build$ + ")" + nl + nl ' Get CPU type and operating mode. Dim sysinfo As SYSTEM_INFO GetSystemInfo sysinfo msg = msg + "CPU: " Select Case sysinfo.dwProcessorType Case PROCESSOR_INTEL_386 msg = msg + "Intel 386" + nl Case PROCESSOR_INTEL_486 msg = msg + "Intel 486" + nl Case PROCESSOR_INTEL_PENTIUM msg = msg + "Intel Pentium" + nl Case PROCESSOR_MIPS_R4000 msg = msg + "MIPS R4000" + nl Case PROCESSOR_ALPHA_21064 msg = msg + "DEC Alpha 21064" + nl Case Else msg = msg + "(unknown)" + nl End Select msg = msg + nl ' Get free memory. Dim memsts As MEMORYSTATUS Dim memory& GlobalMemoryStatus memsts memory& = memsts.dwTotalPhys msg = msg + "Total Physical Memory: " msg = msg + Format$(memory& \ 1024, "###,###,###") + "K" + nl memory& = memsts.dwAvailPhys msg = msg + "Available Physical Memory: " msg = msg + Format$(memory& \ 1024, "###,###,###") + "K" + nl memory& = memsts.dwTotalVirtual msg = msg + "Total Virtual Memory: " msg = msg + Format$(memory& \ 1024, "###,###,###") + "K" + nl memory& = memsts.dwAvailVirtual msg = msg + "Available Virtual Memory: " msg = msg + Format$(memory& \ 1024, "###,###,###") + "K" + nl _ + nl ' Get free system resources. ' Not applicable to 32-bit operating system (Windows NT). #Else ' Get operating system and version. ver& = GetVersion() status& = GetWinFlags() If status& And WF_WINNT Then msg = msg + "Microsoft Windows NT " Else msg = msg + "Microsoft Windows " End If ver_major$ = Format$(ver& And &HFF) ver_minor$ = Format$((ver& And &HFF00) \ &H100, "00") msg = msg + ver_major$ + "." + ver_minor$ + nl ' Get CPU type and operating mode. msg = msg + "CPU: " If status& And WF_CPU286 Then msg = msg + "80286" If status& And WF_CPU386 Then msg = msg + "80386" If status& And WF_CPU486 Then msg = msg + "80486" If status& And WF_80x87 Then msg = msg + " with 80x87" msg = msg + nl msg = msg + "Mode: " If status& And WF_STANDARD Then msg = msg + "Standard" + nl If status& And WF_ENHANCED Then msg = msg + "Enhanced" + nl ' Get free memory. memory& = GetFreeSpace(0) msg = msg + "Memory free: " msg = msg + Format$(memory& \ 1024, "###,###,###") + "K" + nl memory& = GlobalCompact(&HFFFFFFFF) msg = msg + "Largest free block: " msg = msg + Format$(memory& \ 1024, "###,###,###") + "K" + nl ' Get free system resources. ' The SystemHeapInfo API function became available in Windows ' version 3.1. msg = msg + "System resources: " If ver& >= &H310 Then Dim shi As SYSHEAPINFO shi.dwSize = Len(shi) If SystemHeapInfo(shi) Then If shi.wUserFreePercent < shi.wGDIFreePercent Then msg = msg + Format$(shi.wUserFreePercent) + "%" Else msg = msg + Format$(shi.wGDIFreePercent) + "%" End If End If Else msg = msg + "n/a" End If #End If MsgBox msg, 0, "About " + Caption MousePointer = 0 End Sub 5. Press the F5 key to run the program. Additional query words: ====================================================================== Keywords : kbAPI kbSDKWin32 kbVBp kbVBp400 kbVBp500 kbVBp600 kbGrpDSVB kbDSupport Technology : kbVBSearch kbAudDeveloper kbZNotKeyword6 kbZNotKeyword2 kbVB500Search kbVB600Search kbVB500 kbVB600 kbVB400Search kbVB400 kbVB16bitSearch Version : :4.0,5.0,6.0 Issue type : kbhowto ============================================================================= THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY. Copyright Microsoft Corporation 2002.