C 将虚拟盖关闭开关添加到Windows以进行测试

C 将虚拟盖关闭开关添加到Windows以进行测试,c,windows,api,winapi,power-management,C,Windows,Api,Winapi,Power Management,我为一个非常基本的事件实现了一些源代码,该事件注册为在Windows中的lid close事件上执行,现在我想为它添加一些单元测试。在windows lid close中,设置了“不执行任何操作”,以便计算机仍在运行,等等。我的应用程序已经运行良好-我以其他方式对其进行了测试,但希望添加单元测试以确保代码的清晰性 有没有什么方法可以在Windows上添加一个虚拟的盖子关闭按钮,我可以用它来测试我的应用程序的操作?到目前为止,我在互联网上找不到任何东西,如果有人能告诉我这是否可能以及如何可能,那就

我为一个非常基本的事件实现了一些源代码,该事件注册为在Windows中的lid close事件上执行,现在我想为它添加一些单元测试。在windows lid close中,设置了“不执行任何操作”,以便计算机仍在运行,等等。我的应用程序已经运行良好-我以其他方式对其进行了测试,但希望添加单元测试以确保代码的清晰性


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

最好的建议是通过发送/发布windows消息来假装盖子关闭。例如,如果您正在使用注册一个窗口以接收盖关闭事件,则通知将作为带有
wParam
参数的消息发送到您的窗口。您可以在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);

请阅读有关Windows事件及其生成、传播和处理方式的信息。API中有一些函数可以发送任何窗口或消息。因为我自己没有时间搜索API,所以这里没有给您的指针。无论如何,这也是你的任务。当然,这是我已经尝试过的,但找不到这个特定事件以及如何发送它。。。因此,如果有人有更有用的评论,请让我知道!:)好的,因为您的代码对该事件有反应,所以您已经知道它的值和参数,很可能是从它的文档中知道的。你为什么不把它贴出来?--你可能想用目前为止的发现来回答你的问题。