微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Windows中添加虚拟机盖开关进行测试

如何解决在Windows中添加虚拟机盖开关进行测试

我为一个非常基本的事件实现了一些源代码,该事件已注册为在Windows中的盖关闭事件中执行,现在想为其添加一些单元测试。在Windows lid-close中,什么也没做,所以计算机仍然可以运行,等等。我的应用程序已经可以正常工作-我以其他方式对其进行了测试,但希望添加单元测试以确保代码的清晰性。

是否可以通过某种方式向Windows添加虚拟的盖关闭按钮,以测试应用程序中的动作?到目前为止,我在互联网上找不到任何东西,因此,如果能告诉我是否以及如何做到这一点,那就太好了。编写一个左右的驱动程序根本没有问题-我只想添加实现!谢谢!

解决方法

最好的建议是通过发送/发布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",0);
                        break;
                    default:
                        MessageBox(NULL,L"Unknown",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);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。