スクリーンセーバーはShellExecuteを使用しても起動する事ができますが、このサンプルではコントロールパネルの「画面」で設定されているものを起動し、5秒後に停止(Timerイベント使用)させています。停止の方法がWindows95,98とNTでは異なるので注意してください。
Private Sub Form_Load()
Dim lngActive As Long
Dim lngRet As Long
Dim hWnd As Long
'スクリーンセーバーが設定されているか調べます。
If SystemParametersInfo(SPI_GETSCREENSAVEACTIVE, 0, lngActive, SPIF_UPDATEINIFILE) = 1 Then
'設定されていたならば起動します。
If lngActive = 1 Then
Call SendMessage(Me.hWnd, WM_SYSCOMMAND, SC_SCREENSAVE, ByVal vbNullString)
End If
End If
Timer1.Interval = 5000
End Sub
Private Sub Timer1_Timer()
Dim OSVER As OSVERSIONINFO
OSVER.dwOSVersionInfoSize = Len(OSVER)
Call GetVersionEx(OSVER)
Select Case OSVER.dwPlatformId
Case VER_PLATFORM_WIN32_WINDOWS '95,98
Dim hWnd As Long
hWnd = FindWindow("WindowsScreenSaverClass", vbNullString)
If hWnd <> 0 Then
Call PostMessage(hWnd, WM_CLOSE, 0, 0)
End If
Case VER_PLATFORM_WIN32_NT 'NT
Dim hDesk As Long
hDesk = OpenDesktop("Screen-Saver", 0, False, DESKTOP_READOBJECTS Or DESKTOP_WRITEOBJECTS)
If hDesk <> 0 Then
Call EnumDesktopWindows(hDesk, AddressOf StopScreenSaverProc, 0)
Call CloseDesktop(hDesk)
End If
Case Else
MsgBox "失敗"
End Select
End
End Sub
'-------------------------------------------------------
' Module
'-------------------------------------------------------
'OS判別用
Public Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFO) As Long
Type OSVERSIONINFO
dwOSVersionInfoSize As Long
dwMajorVersion As Long
dwMinorVersion As Long
dwBuildNumber As Long
dwPlatformId As Long
szCSDVersion As String * 128
End Type
Public Const VER_PLATFORM_WIN32_WINDOWS = 1
Public Const VER_PLATFORM_WIN32_NT = 2
'スクリーンセーバー起動・停止用
Public Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, ByRef lpvParam As Any, ByVal fuWinIni As Long) As Long
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function OpenDesktop Lib "user32" Alias "OpenDesktopA" (ByVal lpszDesktop As String, ByVal dwFlags As Long, ByVal fInherit As Boolean, ByVal dwDesiredAccess As Long) As Long
Public Declare Function CloseDesktop Lib "user32" (ByVal hDesktop As Long) As Long
Public Declare Function EnumDesktopWindows Lib "user32" (ByVal hDesktop As Long, ByVal lpfn As Long, ByVal lParam As Long) As Long
Public Const SC_SCREENSAVE = &HF140&
Public Const SPI_GETSCREENSAVEACTIVE = 16
Public Const SPI_SCREENSAVERRUNNING = 97
Public Const SPI_SETSCREENSAVEACTIVE = 17
Public Const SPIF_NOINIFILE = &H0
Public Const SPIF_SENDWININICHANGE = &H2
Public Const SPIF_UPDATEINIFILE = &H1
Public Const DESKTOP_READOBJECTS = &H1&
Public Const DESKTOP_WRITEOBJECTS = &H80&
Public Const WM_CLOSE = &H10
Public Const WM_SYSCOMMAND = &H112
'コールバック関数
Public Function StopScreenSaverProc(ByVal hWnd As Long, lParam As Long) As Boolean
Dim lngRet As Long
Call PostMessage(hWnd, WM_CLOSE, 0, 0)
Call SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, 1, 0, SPIF_SENDWININICHANGE)
StopScreenSaverProc = True
End Function
DownLoad vbtips091.lzh 2KB (VB6.0)