none
PCのロックを認識する方法 RRS feed

  • 質問

  • お世話になります。

    VB2013で開発をしております。

    [Win] + [L] やWindowsの設定で既定の時間経過でロックされる際にそれを認識してイベントを走らせればなぁ・・・
    と思い調べておりましたが、特に見当たりませんでした。
    Win7 ~ 10 で動作できればと思っております。

    何かヒントやいい案はありますでしょうか。

    2016年3月22日 3:00

回答

  • ロックのイベントはWTSRegisterSessionNotification関数を使うことで通知を受信できるようになると思います。

    以下サンプルソースです。

    Imports System.Runtime.InteropServices
    
    Public Class Form1
        Private Const NOTIFY_FOR_THIS_SESSION As Int32 = &H0
        Private Const WM_WTSSESSION_CHANGE As Int32 = &H2B1
        Private Const WTS_SESSION_LOCK As Int32 = &H7
        Private Const WTS_SESSION_UNLOCK As Int32 = &H8
    
        <DllImport("Wtsapi32.dll")> _
        Private Shared Function WTSUnRegisterSessionNotification( _
        ByVal hWnd As IntPtr) As Boolean
        End Function
    
        <DllImport("Wtsapi32.dll")> _
        Private Shared Function WTSRegisterSessionNotification( _
        ByVal hWnd As IntPtr, ByVal dwFlags As Int32) As Boolean
        End Function
    
        <DllImport("user32.dll")> _
        Private Shared Sub PostQuitMessage( _
        ByVal nExitCode As Int32)
        End Sub
     
        Protected Overrides Sub OnHandleCreated(ByVal e As System.EventArgs)
            WTSRegisterSessionNotification(Me.Handle, NOTIFY_FOR_THIS_SESSION)
            MyBase.OnHandleCreated(e)
        End Sub
    
        Protected Overrides Sub OnHandleDestroyed(ByVal e As System.EventArgs)
            WTSUnRegisterSessionNotification(Me.Handle)
            PostQuitMessage(0)
        End Sub
    
        Protected Overrides Sub WndProc(ByRef m As Message)        '
            Select Case (m.Msg)
                Case WM_WTSSESSION_CHANGE
                    Select Case (m.WParam.ToInt32)
                        Case WTS_SESSION_LOCK
                            'ここにロックイベントに対する処理を記述
                            MessageBox.Show("WTS_SESSION_LOCK", "WM_SESSION_CHANGE", MessageBoxButtons.OK)
                        Case WTS_SESSION_UNLOCK
                            'ここにロック解除イベントに対する処理を記述
                            MessageBox.Show("WTS_SESSION_UNLOCK", "WM_SESSION_CHANGE", MessageBoxButtons.OK)
                    End Select
            End Select
            MyBase.WndProc(m)
        End Sub
    End Class



    • 編集済み kenjinoteMVP 2016年3月22日 4:10
    • 回答としてマーク ずっち 2016年3月22日 4:25
    2016年3月22日 3:14

すべての返信

  • ロックのイベントはWTSRegisterSessionNotification関数を使うことで通知を受信できるようになると思います。

    以下サンプルソースです。

    Imports System.Runtime.InteropServices
    
    Public Class Form1
        Private Const NOTIFY_FOR_THIS_SESSION As Int32 = &H0
        Private Const WM_WTSSESSION_CHANGE As Int32 = &H2B1
        Private Const WTS_SESSION_LOCK As Int32 = &H7
        Private Const WTS_SESSION_UNLOCK As Int32 = &H8
    
        <DllImport("Wtsapi32.dll")> _
        Private Shared Function WTSUnRegisterSessionNotification( _
        ByVal hWnd As IntPtr) As Boolean
        End Function
    
        <DllImport("Wtsapi32.dll")> _
        Private Shared Function WTSRegisterSessionNotification( _
        ByVal hWnd As IntPtr, ByVal dwFlags As Int32) As Boolean
        End Function
    
        <DllImport("user32.dll")> _
        Private Shared Sub PostQuitMessage( _
        ByVal nExitCode As Int32)
        End Sub
     
        Protected Overrides Sub OnHandleCreated(ByVal e As System.EventArgs)
            WTSRegisterSessionNotification(Me.Handle, NOTIFY_FOR_THIS_SESSION)
            MyBase.OnHandleCreated(e)
        End Sub
    
        Protected Overrides Sub OnHandleDestroyed(ByVal e As System.EventArgs)
            WTSUnRegisterSessionNotification(Me.Handle)
            PostQuitMessage(0)
        End Sub
    
        Protected Overrides Sub WndProc(ByRef m As Message)        '
            Select Case (m.Msg)
                Case WM_WTSSESSION_CHANGE
                    Select Case (m.WParam.ToInt32)
                        Case WTS_SESSION_LOCK
                            'ここにロックイベントに対する処理を記述
                            MessageBox.Show("WTS_SESSION_LOCK", "WM_SESSION_CHANGE", MessageBoxButtons.OK)
                        Case WTS_SESSION_UNLOCK
                            'ここにロック解除イベントに対する処理を記述
                            MessageBox.Show("WTS_SESSION_UNLOCK", "WM_SESSION_CHANGE", MessageBoxButtons.OK)
                    End Select
            End Select
            MyBase.WndProc(m)
        End Sub
    End Class



    • 編集済み kenjinoteMVP 2016年3月22日 4:10
    • 回答としてマーク ずっち 2016年3月22日 4:25
    2016年3月22日 3:14
  • kenjinote 様

    迅速な回答ありがとうございました。
    お教えいただいた方法で、無事イベントを取得することができるようになりました。
    またDllImportの存在を初めて知り、そういう意味でも非常にありがたかったです。

    また何かありましたらよろしくお願いいたします!

    2016年3月22日 4:25