This took me a while to figure out, so I thought I would pass it on.
VB Code:
  1. Option Explicit
  2.  
  3. Public Const HKEY_CLASSES_ROOT = &H80000000
  4. Public Const HKEY_CURRENT_USER = &H80000001
  5. Public Const HKEY_LOCAL_MACHINE = &H80000002
  6. Public Const HKEY_USERS = &H80000003
  7. Public Const HKEY_PERFORMANCE_DATA = &H80000004
  8. Public Const HKEY_CURRENT_CONFIG = &H80000005
  9. Public Const HKEY_DYN_DATA = &H80000006
  10. Public Const REG_SZ = 1                         ' Unicode nul terminated string
  11. Public Const REG_BINARY = 3                     ' Free form binary
  12. Public Const REG_DWORD = 4                      ' 32-bit number
  13. Public Const ERROR_SUCCESS = 0&
  14.  
  15. Public Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
  16. Public Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
  17. Public Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
  18. Public Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" (ByVal hKey As Long, ByVal lpSubKey As String) As Long
  19. Public Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String) As Long
  20. '--------------------------------------------------
  21. Public Declare Function RegEnumKey Lib "advapi32.dll" Alias "RegEnumKeyA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpName As String, ByVal cbName As Long) As Long
  22. Public Declare Function RegEnumValue Lib "advapi32.dll" Alias "RegEnumValueA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpValueName As String, lpcbValueName As Long, lpReserved As Long, lpType As Long, lpData As Byte, lpcbData As Long) As Long
  23. '--------------------------------------------------
  24. Public Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long
  25. Public Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long
  26.  
  27. Private Const SPI_SETSCREENSAVEACTIVE = 17
  28. Private Const SPI_GETSCREENSAVEACTIVE = 16
  29. Private Const SPIF_SENDWININICHANGE = &H2
  30. Private Const SPIF_UPDATEINIFILE = &H1
  31. Private Declare Function SystemParametersInfo Lib "user32" Alias _
  32.     "SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, _
  33.     ByRef lpvParam As Any, ByVal fuWinIni As Long) As Long
  34.    
  35.     'Used to lock workstation
  36. Public Declare Function GetDesktopWindow Lib "user32" () As Long
  37. Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  38. Public Const WM_SYSCOMMAND As Long = &H112&
  39. Public Const SC_SCREENSAVE As Long = &HF140&
  40.  
  41.  
  42.  
  43. Public Sub CreateKey(hKey As Long, strPath As String)
  44. Dim hCurKey As Long
  45. Dim lRegResult As Long
  46.  
  47. lRegResult = RegCreateKey(hKey, strPath, hCurKey)
  48.  
  49. If lRegResult <> ERROR_SUCCESS Then
  50.   ' there is a problem
  51. End If
  52.  
  53. lRegResult = RegCloseKey(hCurKey)
  54.  
  55. End Sub
  56.  
  57.  
  58.  
  59. Public Function GetSettingString(hKey As Long, strPath As String, strValue As String, Optional Default As String) As String
  60. Dim hCurKey As Long
  61. Dim lValueType As Long
  62. Dim strBuffer As String
  63. Dim lDataBufferSize As Long
  64. Dim intZeroPos As Integer
  65. Dim lRegResult As Long
  66.  
  67. ' Set up default value
  68. If Not IsEmpty(Default) Then
  69.   GetSettingString = Default
  70. Else
  71.   GetSettingString = ""
  72. End If
  73.  
  74. ' Open the key and get length of string
  75. lRegResult = RegOpenKey(hKey, strPath, hCurKey)
  76. lRegResult = RegQueryValueEx(hCurKey, strValue, 0&, lValueType, ByVal 0&, lDataBufferSize)
  77.  
  78. If lRegResult = ERROR_SUCCESS Then
  79.  
  80.   If lValueType = REG_SZ Then
  81.     ' initialise string buffer and retrieve string
  82.     strBuffer = String(lDataBufferSize, " ")
  83.     lRegResult = RegQueryValueEx(hCurKey, strValue, 0&, 0&, ByVal strBuffer, lDataBufferSize)
  84.    
  85.     ' format string
  86.     intZeroPos = InStr(strBuffer, Chr$(0))
  87.     If intZeroPos > 0 Then
  88.       GetSettingString = Left$(strBuffer, intZeroPos - 1)
  89.     Else
  90.       GetSettingString = strBuffer
  91.     End If
  92.  
  93.   End If
  94.  
  95. Else
  96.   ' there is a problem
  97. End If
  98.  
  99. lRegResult = RegCloseKey(hCurKey)
  100. End Function
  101.  
  102. Public Sub SaveSettingString(hKey As Long, strPath As String, strValue As String, strData As String)
  103. Dim hCurKey As Long
  104. Dim lRegResult As Long
  105.  
  106. lRegResult = RegCreateKey(hKey, strPath, hCurKey)
  107.  
  108. lRegResult = RegSetValueEx(hCurKey, strValue, 0, REG_SZ, ByVal strData, Len(strData))
  109.  
  110. If lRegResult <> ERROR_SUCCESS Then
  111.   'there is a problem
  112. End If
  113.  
  114. lRegResult = RegCloseKey(hCurKey)
  115. End Sub
  116.  
  117.  
  118.  
  119.  
  120.  
  121. Sub Main()
  122.  
  123. 'This checks the registry to see if there is a current screen saver
  124. If GetSettingString(HKEY_CURRENT_USER, "Control Panel\Desktop", "SCRNSAVE.EXE") = "" Then
  125.     SaveSettingString HKEY_CURRENT_USER, "Control Panel\Desktop", "SCRNSAVE.EXE", "C:\WINNT4.00\black16.scr"
  126. End If
  127. 'This changes the registry to set screensaver to active
  128. SaveSettingString HKEY_CURRENT_USER, "Control Panel\Desktop", "ScreenSaveActive", "1"
  129. 'This changes the screen save to be password protected
  130. SaveSettingString HKEY_CURRENT_USER, "Control Panel\Desktop", "ScreenSaverIsSecure", "1"
  131.  
  132. 'This changes the screensaver to the current screensaver registries
  133. SetScreenSaverState True, True
  134.  
  135. 'Locks the workstation
  136. LockWorkStation
  137.  
  138. End Sub
  139.  
  140. Function SetScreenSaverState(ByVal enabled As Boolean, _
  141.     Optional ByVal PermanentChange As Boolean) As Boolean
  142.     Dim fuWinIni As Long
  143.     If PermanentChange Then
  144.         fuWinIni = SPIF_SENDWININICHANGE Or SPIF_UPDATEINIFILE
  145.     End If
  146.     SetScreenSaverState = SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, enabled, _
  147.         ByVal 0&, fuWinIni) <> 0
  148. End Function
  149.  
  150. Public Sub LockWorkStation()
  151.  
  152.     Dim hwnd As Long
  153.     Dim nRet As Long
  154.    
  155.     'Get Desktop handle
  156.     hwnd = GetDesktopWindow()
  157.    
  158.     'Start screensaver
  159.     nRet = SendMessage(hwnd, WM_SYSCOMMAND, SC_SCREENSAVE, 0&)
  160.    
  161. End Sub