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