WinUI3: обработка события изменения сети на рабочем столе WinUI3 с помощью С++

Я работаю над настольным приложением WinUI3 на С++. Я проверял, как мы можем получить событие, когда сеть, к которой подключена система, меняется. Я наткнулся на событие NetworkInformation.NetworkStatusChanged. Но мне не удалось найти ни одного примера его реализации на C++.

NetworkStatusChangedEventHandler говорит, что у него есть один параметр, который является объектом IInspectable.

Я пытался

static void NetworkStatusChange(winrt::Windows::Foundation::IInspectable const& sender);

Но это дало эту ошибку

*\Generated Files\winrt\Windows.Networking.Connectivity.h(2213,81): error C2297: '.*': not valid as right operand has type 'const M'

Не могли бы вы помочь мне с тем, как правильно реализовать событие NetworkStatusChanged в настольном приложении WinUI3 C++.

Спасибо.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот как это можно сделать с помощью C++/WinRT:

добавьте это в pch.h:

#include <winrt/Windows.Networking.Connectivity.h>

добавьте это где-нибудь в свой код:

// you can instead add a "using namespace Windows::Networking::Connectivity;"
// and use NetworkInformation directly if you prefer
Windows::Networking::Connectivity::NetworkInformation info{};
info.NetworkStatusChanged([=](auto&&...) // sender is not super interesting in this type of event so I've not declared it
{
    // do your stuff here
    MessageBox(nullptr, L"Something Changed!", L"Network", 0);
});

Если вы предпочитаете «сырой» способ C/C++, вот пример: Как асинхронно обнаруживать события изменения сети с помощью C++ WinRT

Не используйте [&] в асинхронных обратных вызовах. К тому времени, когда произойдет обратный вызов, объекты, на которые ссылаются, вероятно, были уничтожены.

Raymond Chen 10.01.2023 18:37

Спасибо, это было очень полезно, не могли бы вы объяснить параметры [=] и (...), используемые в функции NetworkStatusChanged().

Harshith 11.01.2023 07:04

(...) должно быть (auto&&...). В противном случае вы столкнетесь с expr.call: (вариативные параметры функции): «Передача потенциально оцениваемого аргумента типа перечисления с ограниченной областью действия или типа класса ([класс]), имеющего подходящий нетривиальный конструктор копирования, допустимый нетривиальный конструктор перемещения или нетривиальный деструктор ([специальный]) без соответствующего параметра поддерживается условно с семантикой, определяемой реализацией». Некоторые реализации (например, clang) вызывают ошибку времени компиляции и/или выполнения, которые оба допустимы.

Raymond Chen 11.01.2023 21:05

@RaymondChen - Еще раз спасибо. Странно, я даже не видел предупреждения (learn.microsoft.com/en-us/cpp/error-messages/compiler-warni‌​ngs/… ) в окнах Output/ErrorList. (С++ лямбда настолько сложна по сравнению с С#...)

Simon Mourier 11.01.2023 21:15

@Harshith - [=] означает, что в лямбда-коде вы фиксируете все используемые переменные (например, если вы хотите использовать информацию) путем копирования. (auto&&...) означает, что вы не хотите идентифицировать/использовать параметры, но хотите, чтобы система компилировалась. learn.microsoft.com/en-us/cpp/cpp/lambda-expressions-in-cpp

Simon Mourier 11.01.2023 21:16

Другие вопросы по теме