最好的建议是通过发送/发布 windows 消息来假装盖子关闭。例如,如果您使用RegisterPowerSettingNotification 注册一个窗口以接收合盖事件,则通知将作为WM_POWERBROADCAST 消息发送到您的窗口,其中wParam 参数为PBT_POWERSETTINGCHANGE。您可以在 Windows 循环中处理该事件:
HPOWERNOTIFY lidcloseRegHandle;
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CREATE:
lidcloseRegHandle = RegisterPowerSettingNotification(hWnd, &GUID_LIDSWITCH_STATE_CHANGE, DEVICE_NOTIFY_WINDOW_HANDLE);
break;
case WM_POWERBROADCAST:
{
if (wParam == PBT_POWERSETTINGCHANGE)
{
if (IsEqualGUID(powersetting->PowerSetting, GUID_LIDSWITCH_STATE_CHANGE))
{
switch (powersetting->Data[0])
{
case 0:
MessageBox(NULL, L"Close", L"event", 0);
break;
case 1:
MessageBox(NULL, L"Open", L"event", 0);
break;
default:
MessageBox(NULL, L"Unknown", L"event", 0);
break;
}
}
}
}
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code that uses hdc here...
EndPaint(hWnd, &ps);
}
break;
case WM_DESTROY:
UnregisterPowerSettingNotification(lidcloseRegHandle);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
测试样本:
HWND hwnd = FindWindow(NULL,L"lid-close-notification-window");
POWERBROADCAST_SETTING powersetting = { 0 };
powersetting.PowerSetting = GUID_LIDSWITCH_STATE_CHANGE;
powersetting.DataLength = 1;
powersetting.Data[0] = 0; //close
SendMessage(hwnd, WM_POWERBROADCAST, PBT_POWERSETTINGCHANGE, (LPARAM)&powersetting);