Я пытаюсь обнаружить, когда крышка ноутбука открывается и закрывается, должна быть реальной. Я могу правильно зарегистрировать это событие, но потом я не получаю уведомление, когда закрываю окно ноутбука.RegisterPowerSettingsNotification C# pinvoke
Вот DLL Импорт
(код DLL: http://www.pinvoke.net/default.aspx/user32/registerpowersettingnotification.html) (GUID_LIDCLOSE_ACTION: http://social.msdn.microsoft.com/Forums/en-US/tabletandtouch/thread/0bbf90be-9322-47fb-bfa4-016b57211b3a)
[DllImport(@"User32", SetLastError = true,
EntryPoint = "RegisterPowerSettingNotification",
CallingConvention = CallingConvention.StdCall)]
private static extern IntPtr RegisterPowerSettingNotification(
IntPtr hRecipient,
ref Guid PowerSettingGuid,
Int32 Flags);
static Guid GUID_LIDCLOSE_ACTION =
new Guid(0xBA3E0F4D, 0xB817, 0x4094, 0xA2, 0xD1,
0xD5, 0x63, 0x79, 0xE6, 0xA0, 0xF3);
private const int WM_POWERBROADCAST = 0x0218;
private const int DEVICE_NOTIFY_WINDOW_HANDLE = 0x00000000;
const int PBT_POWERSETTINGCHANGE = 0x8013; // DPPE
[StructLayout(LayoutKind.Sequential, Pack = 4)]
internal struct POWERBROADCAST_SETTING
{
public Guid PowerSetting;
public uint DataLength;
public byte Data;
}
А потом вот как я регистрируя событие GUID_LIDCLOSE_ACTION:
private void registerLidClosedNotification()
{
IntPtr hWnd = this.Handle;
IntPtr ret = RegisterPowerSettingNotification(hWnd,
ref GUID_LIDCLOSE_ACTION,
DEVICE_NOTIFY_WINDOW_HANDLE);
Debug.WriteLine("Registered: " + ret.ToString());
Debug.WriteLIne("LastError:" + Marshal.GetLastWin32Error().ToString());
}
Вот вывод из этого:
Registered: 6867560
LastError:0
Выглядит хорошо для меня.
Тогда где я должен Получать сообщение:
private static IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
Debug.WriteLine("Entered: WndProc"); // we never make it even this far!
Так почему не это делает его функции WndProc, если он зарегистрирован: [
Вы не разместили ни одного кода, предлагающего вам зарегистрировать свой WndProc с HWND. Это просто отсутствует в образце? В противном случае это может быть вашей проблемой ... –
Ой не понимал, что это был шаг? – y2k
Ах, тогда я отвечу. Минуточку. –