2016-06-08 177 views
0

告訴我該怎麼做,我不知道在哪裏尋找答案。捕獲Windows 10中的屏幕鎖定事件(WPF)

我有一個WPF應用程序,使用平板相機使用AForge。當用戶通過鍵盤快捷鍵「Win + L」鎖定系統時 - 相機不再使用(指示燈熄滅),因爲我通過以下給出的事件來控制此過程。

private void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e) 
    { 
     switch (e.Reason) 
     { 

      case SessionSwitchReason.SessionLock: StopCam(); break; 
      case SessionSwitchReason.SessionUnlock: 
       if (this.Window.WindowState != WindowState.Minimized) 
       { 
        StartCam(); 
       } 
       break; 
     } 
    } 

如果用戶按壓屏幕的鎖的按鈕(通常在片劑的頂部),我的相機不關閉(指示燈亮)。我如何跟蹤此事件?

p.s.我的WPF應用程序將在Windows 10平板電腦上運行。

+0

您是否嘗試在調試窗口中打印e.Reason,以查看是否有其他值用於鎖定屏幕。 'Debug.WriteLine(e.Reason)' – bob1024

回答

0

也許我有一個解決方案。此代碼適用於PC,但我沒有在平板電腦上進行測試(因爲我沒有)。你需要添加使用System.Windows.Interop;

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnSourceInitialized(EventArgs e) 
    { 
     base.OnSourceInitialized(e); 
     HwndSource source = PresentationSource.FromVisual(this) as HwndSource; 
     source.AddHook(WndProc); 
    } 

    private const int WM_SYSCOMMAND = 0x0112; 
    private const int SC_MONITORPOWER = 0xf170; 

    private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) 
    { 
     if (msg == WM_SYSCOMMAND) 
     { 
      if (wParam.ToInt32() == SC_MONITORPOWER) 
      { 
       switch (lParam.ToInt32()) 
       { 
        case -1: 
         this.listBox1.Items.Add("display is powering on"); 
         break; 

        case 2: 
         this.listBox1.Items.Add("display is being shut off"); 
         break; 
       } 
      } 
     } 

     return IntPtr.Zero; 
    } 

} 
+0

我在平板電腦上檢查過,相機沒有關閉。通過在前面板上運行指示燈來確定。 –