Я работаю над настольным приложением 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++.
Спасибо.
Вот как это можно сделать с помощью 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
Спасибо, это было очень полезно, не могли бы вы объяснить параметры [=] и (...), используемые в функции NetworkStatusChanged().
(...)
должно быть (auto&&...)
. В противном случае вы столкнетесь с expr.call: (вариативные параметры функции): «Передача потенциально оцениваемого аргумента типа перечисления с ограниченной областью действия или типа класса ([класс]), имеющего подходящий нетривиальный конструктор копирования, допустимый нетривиальный конструктор перемещения или нетривиальный деструктор ([специальный]) без соответствующего параметра поддерживается условно с семантикой, определяемой реализацией». Некоторые реализации (например, clang) вызывают ошибку времени компиляции и/или выполнения, которые оба допустимы.
@RaymondChen - Еще раз спасибо. Странно, я даже не видел предупреждения (learn.microsoft.com/en-us/cpp/error-messages/compiler-warnings/… ) в окнах Output/ErrorList. (С++ лямбда настолько сложна по сравнению с С#...)
@Harshith - [=] означает, что в лямбда-коде вы фиксируете все используемые переменные (например, если вы хотите использовать информацию) путем копирования. (auto&&...) означает, что вы не хотите идентифицировать/использовать параметры, но хотите, чтобы система компилировалась. learn.microsoft.com/en-us/cpp/cpp/lambda-expressions-in-cpp
Не используйте
[&]
в асинхронных обратных вызовах. К тому времени, когда произойдет обратный вызов, объекты, на которые ссылаются, вероятно, были уничтожены.