窗体上一个listbox: Option Explicit Const ERROR_MORE_DATA = 234 Const SERVICE_ACTIVE = &H1 Const SERVICE_INACTIVE = &H2 Const SC_MANAGER_ENUMERATE_SERVICE = &H4 Const SERVICE_WIN32_OWN_PROCESS As Long = &H10 Const SERVICE_WIN32_SHARE_PROCESS As Long = &H20 Const SERVICE_WIN32 As Long = SERVICE_WIN32_OWN_PROCESS + SERVICE_WIN32_SHARE_PROCESS Private Type SERVICE_STATUS dwServiceType As Long dwCurrentState As Long dwControlsAccepted As Long dwWin32ExitCode As Long dwServiceSpecificExitCode As Long dwCheckPoint As Long dwWaitHint As Long End Type Private Type ENUM_SERVICE_STATUS lpServiceName As Long lpDisplayName As Long ServiceStatus As SERVICE_STATUS End Type Private Declare Function OpenSCManager Lib "advapi32.dll" Alias "OpenSCManagerA" (ByVal lpMachineName As String, ByVal lpDatabaseName As String, ByVal dwDesiredAccess As Long) As Long Private Declare Function EnumServicesStatus Lib "advapi32.dll" Alias "EnumServicesStatusA" (ByVal hSCManager As Long, ByVal dwServiceType As Long, ByVal dwServiceState As Long, lpServices As Any, ByVal cbBufSize As Long, pcbBytesNeeded As Long, lpServicesReturned As Long, lpResumeHandle As Long) As Long Private Declare Function CloseServiceHandle Lib "advapi32.dll" (ByVal hSCObject As Long) As Long Private Declare Function lstrcpy Lib "kernel32.dll" Alias "lstrcpyA" (szDest As String, szcSource As Long) As Long Private Sub Form_Load() Dim hSCM As Long, lpEnumServiceStatus() As ENUM_SERVICE_STATUS, lngServiceStatusInfoBuffer As Long Dim strServiceName As String * 250, lngBytesNeeded As Long, lngServicesReturned As Long Dim hNextUnreadEntry As Long, lngStructsNeeded As Long, lngResult As Long, i As Long 'Open connection to Service Control Manager. hSCM = OpenSCManager(vbNullString, vbNullString, SC_MANAGER_ENUMERATE_SERVICE) If hSCM = 0 Then MsgBox "OpenSCManager failed. LastDllError = " & CStr(Err.LastDllError) Exit Sub End If 'Get buffer size (bytes) without passing a buffer 'and make sure starts at 0th entry. hNextUnreadEntry = 0 lngResult = EnumServicesStatus(hSCM, SERVICE_WIN32, SERVICE_ACTIVE Or SERVICE_INACTIVE, ByVal &H0, &H0, lngBytesNeeded, lngServicesReturned, hNextUnreadEntry) 'We should receive MORE_DATA error. If Not Err.LastDllError = ERROR_MORE_DATA Then MsgBox "LastDLLError = " & CStr(Err.LastDllError) Exit Sub End If 'Calculate the number of structures needed. lngStructsNeeded = lngBytesNeeded / Len(lpEnumServiceStatus(0)) + 1 'Redimension the array according to our calculation. ReDim lpEnumServiceStatus(lngStructsNeeded - 1) 'Get buffer size in bytes. lngServiceStatusInfoBuffer = lngStructsNeeded * Len(lpEnumServiceStatus(0)) 'Get services information starting entry 0. hNextUnreadEntry = 0 lngResult = EnumServicesStatus(hSCM, SERVICE_WIN32, SERVICE_ACTIVE Or SERVICE_INACTIVE, lpEnumServiceStatus(0), lngServiceStatusInfoBuffer, lngBytesNeeded, lngServicesReturned, hNextUnreadEntry) If lngResult = 0 Then MsgBox "EnumServicesStatus failed. LastDllError = " & CStr(Err.LastDllError) Exit Sub End If 'Get the strings and display them. List1.AddItem "全部注册的服务:" For i = 0 To lngServicesReturned - 1 lngResult = lstrcpy(ByVal strServiceName, ByVal lpEnumServiceStatus(i).lpServiceName)
lngResult = lstrcpy(ByVal strServiceName, ByVal lpEnumServiceStatus(i).lpDisplayName) List1.AddItem StripTerminator(strServiceName) + " - " + StripTerminator(strServiceName) Next i 'Clean up. CloseServiceHandle (hSCM) End Sub Function StripTerminator(sInput As String) As String Dim ZeroPos As Integer ZeroPos = InStr(1, sInput, Chr$(0)) If ZeroPos > 0 Then StripTerminator = Left$(sInput, ZeroPos - 1) Else StripTerminator = sInput End If End Function
Option Explicit
Const ERROR_MORE_DATA = 234
Const SERVICE_ACTIVE = &H1
Const SERVICE_INACTIVE = &H2
Const SC_MANAGER_ENUMERATE_SERVICE = &H4
Const SERVICE_WIN32_OWN_PROCESS As Long = &H10
Const SERVICE_WIN32_SHARE_PROCESS As Long = &H20
Const SERVICE_WIN32 As Long = SERVICE_WIN32_OWN_PROCESS + SERVICE_WIN32_SHARE_PROCESS
Private Type SERVICE_STATUS
dwServiceType As Long
dwCurrentState As Long
dwControlsAccepted As Long
dwWin32ExitCode As Long
dwServiceSpecificExitCode As Long
dwCheckPoint As Long
dwWaitHint As Long
End Type
Private Type ENUM_SERVICE_STATUS
lpServiceName As Long
lpDisplayName As Long
ServiceStatus As SERVICE_STATUS
End Type
Private Declare Function OpenSCManager Lib "advapi32.dll" Alias "OpenSCManagerA" (ByVal lpMachineName As String, ByVal lpDatabaseName As String, ByVal dwDesiredAccess As Long) As Long
Private Declare Function EnumServicesStatus Lib "advapi32.dll" Alias "EnumServicesStatusA" (ByVal hSCManager As Long, ByVal dwServiceType As Long, ByVal dwServiceState As Long, lpServices As Any, ByVal cbBufSize As Long, pcbBytesNeeded As Long, lpServicesReturned As Long, lpResumeHandle As Long) As Long
Private Declare Function CloseServiceHandle Lib "advapi32.dll" (ByVal hSCObject As Long) As Long
Private Declare Function lstrcpy Lib "kernel32.dll" Alias "lstrcpyA" (szDest As String, szcSource As Long) As Long
Private Sub Form_Load()
Dim hSCM As Long, lpEnumServiceStatus() As ENUM_SERVICE_STATUS, lngServiceStatusInfoBuffer As Long
Dim strServiceName As String * 250, lngBytesNeeded As Long, lngServicesReturned As Long
Dim hNextUnreadEntry As Long, lngStructsNeeded As Long, lngResult As Long, i As Long
'Open connection to Service Control Manager.
hSCM = OpenSCManager(vbNullString, vbNullString, SC_MANAGER_ENUMERATE_SERVICE)
If hSCM = 0 Then
MsgBox "OpenSCManager failed. LastDllError = " & CStr(Err.LastDllError)
Exit Sub
End If
'Get buffer size (bytes) without passing a buffer
'and make sure starts at 0th entry.
hNextUnreadEntry = 0
lngResult = EnumServicesStatus(hSCM, SERVICE_WIN32, SERVICE_ACTIVE Or SERVICE_INACTIVE, ByVal &H0, &H0, lngBytesNeeded, lngServicesReturned, hNextUnreadEntry)
'We should receive MORE_DATA error.
If Not Err.LastDllError = ERROR_MORE_DATA Then
MsgBox "LastDLLError = " & CStr(Err.LastDllError)
Exit Sub
End If
'Calculate the number of structures needed.
lngStructsNeeded = lngBytesNeeded / Len(lpEnumServiceStatus(0)) + 1
'Redimension the array according to our calculation.
ReDim lpEnumServiceStatus(lngStructsNeeded - 1)
'Get buffer size in bytes.
lngServiceStatusInfoBuffer = lngStructsNeeded * Len(lpEnumServiceStatus(0))
'Get services information starting entry 0.
hNextUnreadEntry = 0
lngResult = EnumServicesStatus(hSCM, SERVICE_WIN32, SERVICE_ACTIVE Or SERVICE_INACTIVE, lpEnumServiceStatus(0), lngServiceStatusInfoBuffer, lngBytesNeeded, lngServicesReturned, hNextUnreadEntry)
If lngResult = 0 Then
MsgBox "EnumServicesStatus failed. LastDllError = " & CStr(Err.LastDllError)
Exit Sub
End If
'Get the strings and display them.
List1.AddItem "全部注册的服务:"
For i = 0 To lngServicesReturned - 1
lngResult = lstrcpy(ByVal strServiceName, ByVal lpEnumServiceStatus(i).lpServiceName)
lngResult = lstrcpy(ByVal strServiceName, ByVal lpEnumServiceStatus(i).lpDisplayName)
List1.AddItem StripTerminator(strServiceName) + " - " + StripTerminator(strServiceName)
Next i
'Clean up.
CloseServiceHandle (hSCM)
End Sub
Function StripTerminator(sInput As String) As String
Dim ZeroPos As Integer
ZeroPos = InStr(1, sInput, Chr$(0))
If ZeroPos > 0 Then
StripTerminator = Left$(sInput, ZeroPos - 1)
Else
StripTerminator = sInput
End If
End Function
我用的是listview控件
要求显示跟系统那个服务管理程序显示的一样!!我留个QQ:389351