You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WinUI3桌面C++应用中NetworkStatusChanged事件的正确实现

WinUI3 C++ 实现网络连接变更事件监听

问题原因

你遇到的C2297错误,是因为静态函数的绑定方式不符合WinRT事件订阅的语法要求,且WinRT事件更适合使用类成员函数作为处理函数(避免静态函数带来的全局状态问题)。

正确实现步骤

1. 头文件定义

在你的窗口类头文件中,添加事件处理函数声明和事件令牌成员:

#pragma once

#include <winrt/Windows.UI.Xaml.h>
#include <winrt/Windows.UI.Xaml.Controls.h>
#include <winrt/Windows.Networking.Connectivity.h>
#include <winrt/Windows.Foundation.h>

namespace winrt::YourAppNamespace::implementation
{
    struct MainWindow : MainWindowT<MainWindow>
    {
        MainWindow();
        // 网络状态变更处理函数
        void NetworkStatusChange(winrt::Windows::Foundation::IInspectable const& sender);
    private:
        // 保存事件令牌,用于后续取消订阅
        winrt::event_token m_networkStatusToken;
    };
}

2. 实现订阅与事件处理

在窗口的实现文件中,完成事件订阅和处理逻辑:

#include "pch.h"
#include "MainWindow.h"
#include "MainWindow.g.cpp"

namespace winrt::YourAppNamespace::implementation
{
    MainWindow::MainWindow()
    {
        InitializeComponent();

        // 获取NetworkInformation实例并订阅事件
        auto networkInfo = winrt::Windows::Networking::Connectivity::NetworkInformation::GetDefault();
        m_networkStatusToken = networkInfo.NetworkStatusChanged({ this, &MainWindow::NetworkStatusChange });
    }

    void MainWindow::NetworkStatusChange(winrt::Windows::Foundation::IInspectable const& sender)
    {
        // 这里编写网络状态变更后的处理逻辑
        auto internetProfile = winrt::Windows::Networking::Connectivity::NetworkInformation::GetInternetConnectionProfile();
        if (internetProfile != nullptr)
        {
            auto connLevel = internetProfile.GetNetworkConnectivityLevel();
            // 根据连接级别判断当前网络状态
            // 示例:NetworkConnectivityLevel::InternetAccess 表示已连接到互联网
        }
    }
}

3. 取消订阅(可选但推荐)

为避免内存泄漏,在窗口销毁时取消事件订阅:

MainWindow::~MainWindow()
{
    auto networkInfo = winrt::Windows::Networking::Connectivity::NetworkInformation::GetDefault();
    networkInfo.NetworkStatusChanged(m_networkStatusToken);
}

关键说明

  • 不要使用静态函数作为事件处理函数:WinRT事件订阅成员函数时需要类实例指针,静态函数无法绑定到实例,容易引发编译错误。
  • 必须保存事件令牌:用于后续取消订阅,防止窗口销毁后事件回调仍被触发。

内容的提问来源于stack exchange,提问作者Harshith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 11:30:57