By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
448,910 Members | 1,795 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 448,910 IT Pros & Developers. It's quick & easy.

Screensaver Event WM_GETMESSAGE Hook

P: n/a
I am trying to capture an event when the screensaver starts. I have code
working on Windows XP etc when the Password/Welcome Screen is enabled
[Workstation is Locked]. Using the Fast User Switching Notifications.

However I am unable to detect the screensaver starting when the screensaver
password option is disabled. When using the WndProc Overrides I am unable to
capture the screensaver event unless the application is active [Our software
often sits in the Windows system tray].

Thank you in advance for any help that is given. I am attempting to use a
Hook to capture the WM_GETMESSAGE Hook using VB.NET my code is as follows:

Imports System.Windows.Forms
Imports System.Runtime.InteropServices

Public Class Screensaver

Dim hp As New HookProc(AddressOf KeyboardProc)

Public Const WH_GETMESSAGE = 3
Public Const HC_ACTION = 0

Private m_ScreensaverHook As IntPtr

Private Declare Auto Function UnhookWindowsHookEx Lib "user32" Alias
"UnhookWindowsHookEx" (ByVal hHook As IntPtr) As Integer
Private Declare Auto Function SetWindowsHookEx Lib "user32" (ByVal
idHook As Integer, ByVal lpfn As HookProc, ByVal hMod As Long, ByVal
dwThreadId As Integer) As IntPtr
Private Declare Auto Function CallNextHookEx Lib "user32" (ByVal curHook
As IntPtr, ByVal nCode As Integer, ByVal wParam As Integer, ByVal lParam As
Private Delegate Function HookProc(ByVal code As Integer, ByVal wParam
As Integer, ByVal lParam As IntPtr) As IntPtr

' Events
Public Event Screensaver(ByVal m As Message)

Public Sub SetHook()
Dim hInstance As Long =
System.Runtime.InteropServices.Marshal.GetHINSTANC E(System.Reflection.Assembly.GetExecutingAssembly. GetModules()(0)).ToInt32()
Dim hThreadId As Integer = AppDomain.GetCurrentThreadId()
'Dim hThreadId As Integer = 0
m_ScreensaverHook = SetWindowsHookEx(WH_GETMESSAGE, hp, hInstance,
End Sub

Public Sub Unhook()
If m_ScreensaverHook.ToInt32 <> 0 Then
End Sub

Private Function KeyboardProc(ByVal nCode As Integer, ByVal wParam As
Integer, ByVal lParam As IntPtr) As IntPtr

If (nCode < HC_ACTION) Then
Return CallNextHookEx(m_ScreensaverHook, nCode, wParam,

ElseIf (nCode = HC_ACTION) Then
Dim m As Message
m = CType(Marshal.PtrToStructure(lParam, GetType(Message)),
RaiseEvent Screensaver(m)
End If

End Function
End Class
Jul 21 '05 #1
Share this question for a faster answer!
Share on Google+

This discussion thread is closed

Replies have been disabled for this discussion.