Определить открыта ли крышка от ноутбука - Visual Basic .NET
Формулировка задачи:
Доброго всем..
Кто нибудь писал под ноуты определение открыта ли крышка ? Поделитесь кодом)
Нашёл в инете пару библиотек(кривые) да и не хочу использовать их.. В принцепе можно конечно отследить включена ли матрица и с этого танцевать... Но есть пару прог которые тоже будут включены и вот они будут мешать определение включен ли монитор.. тоесть отпадает вариант с матрицей...
Если есть у кого что на уме .. подскажите)
Решение задачи: «Определить открыта ли крышка от ноутбука»
textual
Листинг программы
- using System;
- using System.Diagnostics;
- using System.Runtime.InteropServices;
- using System.Windows;
- using System.Windows.Interop;
- namespace WpfApplication1
- {
- /// <summary>
- /// Interaction logic for MainWindow.xaml
- /// </summary>
- public partial class MainWindow : Window
- {
- [DllImport(@"User32", SetLastError = true, EntryPoint = "RegisterPowerSettingNotification",
- CallingConvention = CallingConvention.StdCall)]
- private static extern IntPtr RegisterPowerSettingNotification(IntPtr hRecipient, ref Guid PowerSettingGuid,
- Int32 Flags);
- internal struct POWERBROADCAST_SETTING
- {
- public Guid PowerSetting;
- public uint DataLength;
- public byte Data;
- }
- Guid GUID_LIDSWITCH_STATE_CHANGE = new Guid(0xBA3E0F4D, 0xB817, 0x4094, 0xA2, 0xD1, 0xD5, 0x63, 0x79, 0xE6, 0xA0, 0xF3);
- const int DEVICE_NOTIFY_WINDOW_HANDLE = 0x00000000;
- const int WM_POWERBROADCAST = 0x0218;
- const int PBT_POWERSETTINGCHANGE = 0x8013;
- private bool? _previousLidState = null;
- public MainWindow()
- {
- InitializeComponent();
- this.SourceInitialized += MainWindow_SourceInitialized;
- }
- void MainWindow_SourceInitialized(object sender, EventArgs e)
- {
- RegisterForPowerNotifications();
- IntPtr hwnd = new WindowInteropHelper(this).Handle;
- HwndSource.FromHwnd(hwnd).AddHook(new HwndSourceHook(WndProc));
- }
- private void RegisterForPowerNotifications()
- {
- IntPtr handle = new WindowInteropHelper(Application.Current.Windows[0]).Handle;
- IntPtr hLIDSWITCHSTATECHANGE = RegisterPowerSettingNotification(handle,
- ref GUID_LIDSWITCH_STATE_CHANGE,
- DEVICE_NOTIFY_WINDOW_HANDLE);
- }
- IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
- {
- switch (msg)
- {
- case WM_POWERBROADCAST:
- OnPowerBroadcast(wParam, lParam);
- break;
- default:
- break;
- }
- return IntPtr.Zero;
- }
- private void OnPowerBroadcast(IntPtr wParam, IntPtr lParam)
- {
- if ((int)wParam == PBT_POWERSETTINGCHANGE)
- {
- POWERBROADCAST_SETTING ps = (POWERBROADCAST_SETTING)Marshal.PtrToStructure(lParam, typeof(POWERBROADCAST_SETTING));
- IntPtr pData = (IntPtr)((int)lParam + Marshal.SizeOf(ps));
- Int32 iData = (Int32)Marshal.PtrToStructure(pData, typeof(Int32));
- if (ps.PowerSetting == GUID_LIDSWITCH_STATE_CHANGE)
- {
- bool isLidOpen = ps.Data != 0;
- if (!isLidOpen == _previousLidState)
- {
- LidStatusChanged(isLidOpen);
- }
- _previousLidState = isLidOpen;
- }
- }
- }
- private void LidStatusChanged(bool isLidOpen)
- {
- if (isLidOpen)
- {
- //Do some action on lid open event
- Debug.WriteLine("{0}: Lid opened!", DateTime.Now);
- }
- else
- {
- //Do some action on lid close event
- Debug.WriteLine("{0}: Lid closed!", DateTime.Now);
- }
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д