VBレスキュー(花ちゃん)
VB2005用トップページへVBレスキュー(花ちゃん)のトップページVB6.0用のトップページ各掲示板

リンク元へ戻ります。 システム・情報関係のメニュー
1.Windowsのシステムディレクトリのパス名を取得する
2.Windows のバージョンを取得する
3.終了時の情報を保存・読み込み・反映(レジストリ使用・他)
4.Windows を終了・再起動する
5.スクリーンセーバーの起動及び解除
6.タスクバーを自動で隠す・常に手前に表示を設定・取得
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.その他、当サイト内に掲載のシステム・情報に関するサンプル


5.スクリーンセーバーの起動及び解除
1.スクリーンセーバーの起動及び解除
2. 
3. 
4. 
5. 
6. 

 下記プログラムコードに関する補足・注意事項 
動作確認:Windows Vista・Windows 7 (32bit) / VB6.0(SP6)
Option :[Option Explicit]
参照設定:SendInputV6                  参照設定方法参照
使用 API:SetCursorPos / GetCursorPos / SystemParametersInfo / SendMessage / GetDesktopWindow
その他 :このサンプルは、 Win32 APIを使用しておりますので、ある程度Win32 API が理解できる方がお使い下さい。
    :
このページのトップへ移動します。 1.スクリーンセーバーの起動及び解除
通常、時間がかかる処理をしていると、途中でスクリーンセーバーが起動して処理が終わっているのが確認できない場合があるのでそのような場合に、起動しているスクリーンセーバーを停止して処理が終わっている事を示すような場合に使うことを想定して動作テストをしております。

Option Explicit

'マウスのカーソル位置を設定する (389)
Private Declare Function SetCursorPos Lib "user32" ( _
  ByVal x As Integer, ByVal y As Integer) As Long

'現在のマウスカーソルの位置座標を取得する(P387)
Private Declare Function GetCursorPos Lib "user32" ( _
  lpPoint As MoPoint) As Long

'システム全体に関するパラメーターを取得・設定する(P928)
Private Declare Function SystemParametersInfo Lib "user32.dll" _
  Alias "SystemParametersInfoA" ( _
  ByVal uiAction As Long, ByVal uiParam As Long, _
  pvParam As Any, ByVal fWinIni As Long) As Long

'指定のウィンドウにメッセージを送る(P750)
Private Declare Function SendMessage Lib "user32" _
  Alias "SendMessageA" (ByVal hwnd As Long, _
  ByVal wMsg As Long, ByVal wParam As Long, _
  lParam As Any) As Long

'デスクトップウィンドウのハンドルを取得する(85)
Private Declare Function GetDesktopWindow Lib "user32" () As Long

'スクリーンセーバーが起動中かを取得する定数
Private Const SPI_GETSCREENSAVERRUNNING = 114
'スクリーンセーバー実行までの待ち時間を取得する定数
Private Const SPI_GETSCREENSAVETIMEOUT = 14

'システムメニューが操作された時、そのウィンドウに送られるメッセージ (P889)
Private Const WM_SYSCOMMAND = &H112&

'スクリーンセーバーを起動する (P889)
Private Const SC_SCREENSAVE = &HF140&  '後ろに必ず & を付ける事

'ポインターのX座標とY座標を定義する構造体
Private Type MoPoint
  x As Long
  y As Long
End Type

Private x1 As Long
Private y1 As Long
Private MoP As MoPoint

Private Sub Command1_Click()
  Dim lngSaverOn As Long
  Dim lngRet   As Long
  'スクリーンセーバーを起動
  lngRet = SendMessage(Me.hwnd, WM_SYSCOMMAND, SC_SCREENSAVE, ByVal 0&)

  '時間のかかる処理が終わる(実機では必要なし)
  Dim SI As New SendInputV6.Class1
  SI.WaitTime 75000  '75 秒待つ(この間終了しないで下さい。時間が経過するまで起動しているので)

'時間のかかる処理が終わった時
'-----------------------------------------------------------------------------
  'スクリーンセーバーが起動中かを調べる
  lngRet = SystemParametersInfo(SPI_GETSCREENSAVERRUNNING, 0, lngSaverOn, 0)
  If lngSaverOn Then
    'スクリーンセーバーの稼働を停止
    sSaverOff
  End If

  'その後再度スクリーンセーバーが起動したら停止すべく監視する(Interval は適当に)
  Timer1.Interval = 2000 '2 秒毎にスクリーンセーバーが起動中かを調べる
  Timer1.Enabled = True

  'メッセージボックスを使用しない事
  Label1.Caption = "月次処理は終了しました。"
End Sub

Private Sub Command2_Click()
  Timer1.Enabled = False
End Sub


Private Sub Timer1_Timer()
  Dim lngSaverOn As Long
  Dim lngRet   As Long
  'スクリーンセーバーが起動中かを調べる
  lngRet = SystemParametersInfo(SPI_GETSCREENSAVERRUNNING, 0, lngSaverOn, 0)
  If lngSaverOn Then
    sSaverOff
  End If
End Sub

Private Sub sSaverOff()
  'このウィンドウをトップ位置に移動しアクティブにする
  Dim SI As New SendInputV6.Class1
  Call SI.fSetForGrdWindow(Me.hwnd)

  '現在の位置を保存(保存せずに移動するだけでもOKだが)
  GetCursorPos MoP
  x1 = MoP.x
  y1 = MoP.y
  MoP.x = 0
  MoP.y = 0
  'マウスポインターを左上に移動(セーバー停止)
  SetCursorPos MoP.x, MoP.y
  SI.WaitTime 50
  '移動が終了するのを待って元の位置に戻す
  MoP.x = x1
  MoP.y = y1
  'マウスポインターを元の位置に戻す
  SetCursorPos MoP.x, MoP.y
  SI.WaitTime 50
End Sub



lngRet = SystemParametersInfo(SPI_GETSCREENSAVETIMEOUT, 0, lngSaverOn, 0) のようにする事で、スクリーンセーバー実行までの待ち時間を取得する事ができます。取得した待ち時間は、lngSaverOn に格納されます。
又、上記とは別に、スクリーンセーバーの起動を防止するには、サブクラス化してスクリーンセーバーの起動のメッセージを殺す事で実現できます。

SendInputV6 は下記より、ダウンロードして、EXE と同じフォルダーにでも解凍し、参照設定してお使い下さい。
ダウンロード先 http://hanatyan.sakura.ne.jp/freesoft/SendInputV6.zip
プロジェクト→参照設定→参照ボタン→ SendInputV6.dll を参照して下さい。
レジストリに登録/削除するには、ファイル名を指定して実行から下記をコードを実行
登録 regsvr32 SendInputV6.dllが保存されているフルパス\SendInputV6.dll
削除 regsvr32 /u SendInputV6.dllが保存されているフルパス\SendInputV6.dll

Dim SI As New SendInputV6.Class1 のように宣言すれば、後は、下記のようにして使用できます。
Call SI.WaitTime(500)

このページのトップへ移動します。 2. 


このページのトップへ移動します。 3.


このページのトップへ移動します。 4.


このページのトップへ移動します。 5.


このページのトップへ移動します。 6.


このページのトップへ移動します。 検索キーワード及びサンプルコードの別名(機能名)
1.スクリーンセーバーを起動  2.スクリーンセーバーが起動中かを調べる  3.スクリーンセーバーを解除  4.スクリーンセーバー実行までの待ち時間を取得する
スクリーンセーバーが設定されている場合時間のかかる処理が終った後終了のメッセージを出してもスクリーンセーバーの後ろに隠れて終了が解らない場合。終了時にスクリーンセーバーが起動中なら解除してメッセージを表示する


このページのトップへ移動します。