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.スクリーンセーバー実行までの待ち時間を取得する スクリーンセーバーが設定されている場合時間のかかる処理が終った後終了のメッセージを出してもスクリーンセーバーの後ろに隠れて終了が解らない場合。終了時にスクリーンセーバーが起動中なら解除してメッセージを表示する |