| | タイトル | : Re: スクリーンセーバーの解除 |  | 記事No | : 14230 |  | 投稿日 | : 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かと。
 
 以上。参考まで
 
 |