【问题标题】:Adding virtual lid-close switch to Windows for testing将虚拟盖子关闭开关添加到 Windows 以进行测试
【发布时间】:2020-12-18 21:23:18
【问题描述】:

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

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

【问题讨论】:

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

标签: c windows api winapi power-management


【解决方案1】:

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

【讨论】:

  • 如果我只想检查盖子状态并根据它是打开还是关闭来做一些事情,我该怎么做?我得到了你的一些代码,但不知道如何把它们放在一起......
猜你喜欢
  • 1970-01-01
  • 2011-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
  • 2015-09-01
  • 1970-01-01
相关资源
最近更新 更多