tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re: スクリーンセーバーの解除
投稿日: 2009/11/06(Fri) 19:32
投稿者オショウ
> とほぼ同様の手順で、マウスカーソルを移動させているのですが
> セーバー解除できないときが発生します

  その方法でできない場合もあるみたいですが・・・
  テストされた折のスクリーンセーバーは何だったのでしょうか?

  できない原因は、WM_SYSCOMMAND/SC_SCREANSAVEメッセージをブロード
  キャストしてくれないものの場合・・・(多分)

● WndProcをフックして行うケース

' Module.bas

Option Explicit

Declare Function CallWindowProc Lib "user32" Alias _
   "CallWindowProcA" (ByVal lpPrevWndFunc As Long, _
   ByVal hMainWnd As Long, ByVal Msg As Long, _
   ByVal wParam As Long, ByVal lParam As Long) As Long

Declare Function SetWindowLong Lib "user32" Alias _
   "SetWindowLongA" (ByVal hMainWnd As Long, _
   ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    
Public Const GWL_WNDPROC As Long = -4
Public Const WM_SYSCOMMAND As Long = &H112
Public Const SC_SCREENSAVE As Long = &HF140
    
Private lpPrevWndProc As Long
Private hWndBack As Long

Public Sub Hook(ByVal hMainWnd As Long)

    hWndBack = hMainWnd
    lpPrevWndProc = SetWindowLong(hMainWnd, GWL_WNDPROC, AddressOf WndProc)
    
End Sub

Public Sub Unhook()

    Dim temp As Long
    
    temp = SetWindowLong(hWndBack, GWL_WNDPROC, lpPrevWndProc)
    
End Sub

Public Function WndProc(ByVal hw As Long, ByVal uMsg As _
       Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    
    Select Case uMsg
    Case WM_SYSCOMMAND
        Beep
        If wParam = SC_SCREENSAVE Then
            WndProc = 1
            Exit Function
        End If
    End Select
    
    WndProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam)
    
End Function

' Form1.frm

Private Sub Form_Load()

    Call Hook(Me.hWnd)
  
End Sub

Private Sub Form_Unload(Cancel As Integer)

    Unhook
    
End Sub

Private Sub Command1_Click()

    Me.Hide
    Unload Me
    
End Sub

● タイマーで、SetThreadExecutionState API を呼ぶケース

' Module.bas

Declare Function SetThreadExecutionState Lib "kernel32.dll" (ByVal esFlags As Long) As Long

Public Const ES_SYSTEM_REQUIRED As Long = &H1
Public Const ES_DISPLAY_REQUIRED As Long = &H2
Public Const ES_CONTINUOUS As Long = &H80000000

' Form1.frm

Private Sub Form_Load()

    Timer1.Enabled = False
    Timer1.Interval = 5000
    Timer1.Enabled = True
  
End Sub

Private Sub Command1_Click()

    Timer1.Enabled = False

    Me.Hide
    Unload Me
    
End Sub

Private Sub Timer1_Timer()

    SetThreadExecutionState (ES_SYSTEM_REQUIRED Or ES_DISP_REQUIRED)

End Sub

※ WinXP なら、多分、両方OKだと思いますが・・・
  VISTA以降なら、管理者権限が必要でした。

※ VB.NETの場合は、WndProcフックタイプでOKでした。
  管理者権限は不必要でした。
  多分、SetThreadExecutionState API を呼ぶ方もOKかと。

以上。参考まで

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。