注册电源设置认证C#pinvoke

注册电源设置认证C#pinvoke,c#,windows,winapi,pinvoke,C#,Windows,Winapi,Pinvoke,我正在尝试检测笔记本电脑盖何时打开和关闭,应该非常简单。我似乎可以正确注册该事件,但当我关闭笔记本电脑窗口时,我不会收到通知 这是DLL导入 (DLL代码:) (GUID\u LIDCLOSE\u操作:) 下面是我注册GUID\u LIDCLOSE\u操作事件的方式: private void registerLidClosedNotification() { IntPtr hWnd = this.Handle; IntPtr ret = RegisterPowerSetting

我正在尝试检测笔记本电脑盖何时打开和关闭,应该非常简单。我似乎可以正确注册该事件,但当我关闭笔记本电脑窗口时,我不会收到通知

这是DLL导入

(DLL代码:) (GUID\u LIDCLOSE\u操作:)

下面是我注册GUID\u LIDCLOSE\u操作事件的方式:

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());
}
这是它的输出:

注册号码:6867560

上次错误: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函数呢:[

我认为您使用RegisterPowerSettingNotification所做的是让Windows将WM_POWERBROADCAST的消息包含到WndProc中,但您仍然需要实际钩住WndProc

看起来您正在使用WinForms(因为您的示例具有“this.Handle”),在这种情况下,您可以在表单上重写受保护的WndProc方法

如果您使用的是WPF,那么您可以通过为根窗口获取HwndSource,然后调用AddHook来实现这一点


您需要阅读WinForms中有关WndProc的文档(http://msdn.microsoft.com/en-us/library/system.windows.forms.form.wndproc.aspx)。它会被多次调用,因此您只希望在您关心的消息时运行代码,并且无条件地调用base.WndProc。

您没有发布任何代码表明您已向HWND注册了WndProc。这是示例中缺少的吗?否则,这可能是您的问题…哦,没有意识到这是一个步骤吗?啊,我知道我会把它变成一个答案。请稍等。是的,winform,只是一个系统托盘应用程序。谢谢你这么快就弄明白了,并让我知道我还需要挂接它。很高兴它起到了作用。如果你只是在WinForms中做系统托盘的事情,而你已经在p/调用其他东西,你可能想看看p/调用Shell\u NotifyIcon,而不是r比使用WinForms API来实现这些功能要好得多。IIRC WinForms API在这方面有很多遗漏,因为它仍然支持Win2K,并且从那以后没有得到太多的改进。使用较新的标志,您可能会获得更好的通知体验,而且工作量也不会太大。
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!