首页 > 解决方案 > 将虚拟盖子关闭开关添加到 Windows 以进行测试

问题描述

我为一个非常基本的事件实现了一些源代码,该事件注册为在 Windows 中的 lid-close 事件上执行,现在想为它添加一些单元测试。在windows lid-close 中什么都不做,这样计算机仍然可以运行,等等。我的应用程序已经运行良好——我以其他方式对其进行了测试,但想添加单元测试以使代码清晰。

有什么方法可以向 Windows 添加一个虚拟盖子关闭按钮,我可以用它来测试我的应用程序中的操作吗?到目前为止,我在 Internet 上找不到任何东西,所以如果有人能告诉我这是否以及如何实现,那就太好了。编写驱动程序根本没有问题 - 我只想添加实现!谢谢!

标签: cwindowsapiwinapipower-management

解决方案


最好的建议是通过发送/发布 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);

推荐阅读