c - 将虚拟盖子关闭开关添加到 Windows 以进行测试
问题描述
我为一个非常基本的事件实现了一些源代码,该事件注册为在 Windows 中的 lid-close 事件上执行,现在想为它添加一些单元测试。在windows lid-close 中什么都不做,这样计算机仍然可以运行,等等。我的应用程序已经运行良好——我以其他方式对其进行了测试,但想添加单元测试以使代码清晰。
有什么方法可以向 Windows 添加一个虚拟盖子关闭按钮,我可以用它来测试我的应用程序中的操作吗?到目前为止,我在 Internet 上找不到任何东西,所以如果有人能告诉我这是否以及如何实现,那就太好了。编写驱动程序根本没有问题 - 我只想添加实现!谢谢!
解决方案
最好的建议是通过发送/发布 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);
推荐阅读
- python - 无法让 python 测试断言抛出异常
- google-apps-script - 如何通过 Apps 脚本将 FilterView 应用于 Gsheet
- c# - 在编译时已知值为 1 的情况下,Roslyn 是否省略乘以 1?
- python - 如何生成 4-6 个唯一数字
- amp-html - Chrome 似乎正在阻止 amp-facebook,即使在官方 AMP 网站上也是如此
- mongodb - Mongodb - 每个对象的聚合和求和
- mongodb - Docker mongos:在环境变量上提供配置服务器
- c# - C# 调用 web 服务导致 401
- c# - 如何创建符合 MVVM 的 UWP 可重用内容对话框
- javascript - React 组件之间如何传递参数?