ycmsp 发表于 2024-8-29 16:38:29

捕获关机事件

捕获关机事件 付费, 能写的来,137879654

小蜗牛 发表于 2024-8-29 18:51:55

窗口事件有消息通知,你可以看看我的帖子。

shuimiao 发表于 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来编译并运行这段代码。

793359277 发表于 2024-8-29 19:03:21

小蜗牛 发表于 2024-8-29 18:51
窗口事件有消息通知,你可以看看我的帖子。
这人心里有鬼,无视就行了,上个帖子被人锤也不敢说一句,刚才精易也发个一样的帖子,又被锤
页: [1]
查看完整版本: 捕获关机事件