Определить открыта ли крышка от ноутбука - Visual Basic .NET

Узнай цену своей работы

Формулировка задачи:

Доброго всем.. Кто нибудь писал под ноуты определение открыта ли крышка ? Поделитесь кодом) Нашёл в инете пару библиотек(кривые) да и не хочу использовать их.. В принцепе можно конечно отследить включена ли матрица и с этого танцевать... Но есть пару прог которые тоже будут включены и вот они будут мешать определение включен ли монитор.. тоесть отпадает вариант с матрицей... Если есть у кого что на уме .. подскажите)

Решение задачи: «Определить открыта ли крышка от ноутбука»

textual
Листинг программы
  1. using System;
  2. using System.Diagnostics;
  3. using System.Runtime.InteropServices;
  4. using System.Windows;
  5. using System.Windows.Interop;
  6.  
  7. namespace WpfApplication1
  8. {
  9.     /// <summary>
  10.     /// Interaction logic for MainWindow.xaml
  11.     /// </summary>
  12.     public partial class MainWindow : Window
  13.     {
  14.         [DllImport(@"User32", SetLastError = true, EntryPoint = "RegisterPowerSettingNotification",
  15.             CallingConvention = CallingConvention.StdCall)]
  16.  
  17.         private static extern IntPtr RegisterPowerSettingNotification(IntPtr hRecipient, ref Guid PowerSettingGuid,
  18.             Int32 Flags);
  19.  
  20.         internal struct POWERBROADCAST_SETTING
  21.         {
  22.             public Guid PowerSetting;
  23.             public uint DataLength;
  24.             public byte Data;
  25.         }
  26.  
  27.         Guid GUID_LIDSWITCH_STATE_CHANGE = new Guid(0xBA3E0F4D, 0xB817, 0x4094, 0xA2, 0xD1, 0xD5, 0x63, 0x79, 0xE6, 0xA0, 0xF3);
  28.         const int DEVICE_NOTIFY_WINDOW_HANDLE = 0x00000000;
  29.         const int WM_POWERBROADCAST = 0x0218;
  30.         const int PBT_POWERSETTINGCHANGE = 0x8013;
  31.  
  32.         private bool? _previousLidState = null;
  33.  
  34.         public MainWindow()
  35.         {
  36.             InitializeComponent();
  37.             this.SourceInitialized += MainWindow_SourceInitialized;
  38.         }
  39.  
  40.         void MainWindow_SourceInitialized(object sender, EventArgs e)
  41.         {
  42.             RegisterForPowerNotifications();
  43.             IntPtr hwnd = new WindowInteropHelper(this).Handle;
  44.             HwndSource.FromHwnd(hwnd).AddHook(new HwndSourceHook(WndProc));
  45.         }
  46.  
  47.         private void RegisterForPowerNotifications()
  48.         {
  49.             IntPtr handle = new WindowInteropHelper(Application.Current.Windows[0]).Handle;
  50.             IntPtr hLIDSWITCHSTATECHANGE = RegisterPowerSettingNotification(handle,
  51.                  ref GUID_LIDSWITCH_STATE_CHANGE,
  52.                  DEVICE_NOTIFY_WINDOW_HANDLE);
  53.         }
  54.  
  55.         IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
  56.         {
  57.             switch (msg)
  58.             {
  59.                 case WM_POWERBROADCAST:
  60.                     OnPowerBroadcast(wParam, lParam);
  61.                     break;
  62.                 default:
  63.                     break;
  64.             }
  65.             return IntPtr.Zero;
  66.         }
  67.  
  68.         private void OnPowerBroadcast(IntPtr wParam, IntPtr lParam)
  69.         {
  70.             if ((int)wParam == PBT_POWERSETTINGCHANGE)
  71.             {
  72.                 POWERBROADCAST_SETTING ps = (POWERBROADCAST_SETTING)Marshal.PtrToStructure(lParam, typeof(POWERBROADCAST_SETTING));
  73.                 IntPtr pData = (IntPtr)((int)lParam + Marshal.SizeOf(ps));
  74.                 Int32 iData = (Int32)Marshal.PtrToStructure(pData, typeof(Int32));
  75.                 if (ps.PowerSetting == GUID_LIDSWITCH_STATE_CHANGE)
  76.                 {
  77.                     bool isLidOpen = ps.Data != 0;
  78.  
  79.                     if (!isLidOpen == _previousLidState)
  80.                     {
  81.                         LidStatusChanged(isLidOpen);
  82.                     }
  83.  
  84.                     _previousLidState = isLidOpen;
  85.                 }
  86.             }
  87.         }
  88.  
  89.         private void LidStatusChanged(bool isLidOpen)
  90.         {
  91.             if (isLidOpen)
  92.             {
  93.                 //Do some action on lid open event
  94.                 Debug.WriteLine("{0}: Lid opened!", DateTime.Now);
  95.             }
  96.             else
  97.             {
  98.                 //Do some action on lid close event
  99.                 Debug.WriteLine("{0}: Lid closed!", DateTime.Now);
  100.             }
  101.         }
  102.     }
  103. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.133 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы