递归火山软件开发平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 火山 源码 类库
查看: 1092|回复: 3
打印 上一主题 下一主题

[其它] 捕获关机事件

[复制链接]

3

主题

6

帖子

33

积分

新手上路

Rank: 1

积分
33
跳转到指定楼层
楼主
发表于 2024-8-29 16:38:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
捕获关机事件 付费, 能写的来,
回复

使用道具 举报

87

主题

948

帖子

4889

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
4889
沙发
发表于 2024-8-29 18:51:55 来自手机 | 只看该作者
窗口事件有消息通知,你可以看看我的帖子。
回复

使用道具 举报

410

主题

2511

帖子

8281

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
8281
板凳
发表于 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来编译并运行这段代码。
回复

使用道具 举报

22

主题

286

帖子

2003

积分

金牌会员

Rank: 6Rank: 6

积分
2003
QQ
地板
发表于 2024-8-29 19:03:21 | 只看该作者
小蜗牛 发表于 2024-8-29 18:51
窗口事件有消息通知,你可以看看我的帖子。

这人心里有鬼,无视就行了,上个帖子被人锤也不敢说一句,刚才精易也发个一样的帖子,又被锤
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|递归火山软件开发平台 ( 鄂ICP备18029190号 )

GMT+8, 2024-11-24 08:37 , Processed in 0.081942 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表