タイトル : 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かと。 以上。参考まで |