|
板凳
发表于 2024-8-29 18:52:07
来自手机
|
只看该作者
要在C++中捕获Windows系统的关机事件,你可以使用Windows API函数`RegisterPowerSettingNotification`来注册一个通知,当系统状态发生变化时(比如关机、重启等),你的程序将会收到通知。下面是一个简单的示例代码,展示如何实现这个功能:
```cpp
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <wtypes.h>
// 定义一个回调函数用于处理关机事件
void CALLBACK OnPowerSettingChange(PVOID Context, POWERBROADCAST_SETTING PowerSetting)
{
if (PowerSetting->PowerSetting == &GUID_POWERSCHEME_PERSONALITY) {
// 这里可以添加你自己的逻辑,例如记录日志或执行某些操作
printf("System shutdown or restart event detected.\n");
}
}
int main()
{
HANDLE hEvent = NULL;
GUID PowerSchemePersonality = GUID_POWERSCHEME_PERSONALITY;
// 注册关机事件
hEvent = RegisterPowerSettingNotification(
INVALID_HANDLE_VALUE, // 使用NULL表示控制台窗口
&PowerSchemePersonality, // 关注的电源设置
DEVICE_NOTIFY_WINDOW_HANDLE // 控制台窗口句柄
);
if (hEvent == NULL) {
printf("Failed to register for power setting change: %ld\n", GetLastError());
return 1;
}
// 设置回调函数
SetWindowsHookEx(WH_POWER, (HOOKPROC)OnPowerSettingChange, NULL, 0);
// 循环等待事件发生
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
// 清理资源
UnhookWindowsHookEx((HHOOK)OnPowerSettingChange);
UnregisterPowerSettingNotification(hEvent);
CloseHandle(hEvent);
return 0;
}
```
### 注意事项:
1. **权限要求**:为了接收关机事件,你的程序可能需要管理员权限运行。
2. **循环监听**:上述示例中使用了`GetMessage`循环来监听消息。实际应用中你可能需要调整这部分代码以适应你的应用程序结构。
3. **注册与注销**:确保在程序结束前注销事件通知,避免资源泄漏。
这段代码创建了一个简单的控制台程序,当检测到关机或重启事件时会输出一条消息。你可以根据实际需求调整这段代码,例如将输出替换为日志记录或其他操作。
请确保在编译此程序时链接到Windows API库。你可以使用Visual Studio或其他支持C++的IDE来编译并运行这段代码。 |
|