如果建立了互联网连接,如何在 Windows 上收到通知?

问题描述 投票:0回答:1

当我的 Windows 系统获得 Internet 连接时,我希望立即在我的 .Net C# Windows MAUI 应用程序中收到通知。

我的第一个想法是使用

NetworkChange.NetworkAddressChanged
事件。但如果我获得新的 IP 地址,它会通知我。

这可能是与我的路由器的连接,该路由器未连接到互联网。

但是当我的路由器连接到互联网时,Windows 托盘图标会向我显示。所以,我相信 Windows API 可以通知我。

所以我找到了 Windows

NetworkListManager
和他的
INetworkConnectionEvents
界面,它应该通过
NetworkConnectionConnectivityChanged
方法通知我有关连接的更改,例如使用
NLM_CONNECTIVITY_IPV4_INTERNET
,如果已建立与互联网的连接。

我尝试用这个类来实现这个:

public class Receiver : INetworkConnectionEvents
{
    public Receiver()
    {
        var networkListManager = (INetworkListManager)new NetworkListManager();

        var guid = Guid.Parse("DCB00001-570F-4A9B-8D69-199FDBA5723B");
        ((IConnectionPointContainer)networkListManager).FindConnectionPoint(ref guid, out var connectionPoint);
        connectionPoint.Advise(this, out var cookie); // After return cookie is "1"
    }

    public HRESULT NetworkConnectionConnectivityChanged(Guid connectionId, NLM_CONNECTIVITY newConnectivity)
    {
        throw new NotImplementedException();
    }

    public HRESULT NetworkConnectionPropertyChanged(Guid connectionId, NLM_CONNECTION_PROPERTY_CHANGE Flags)
    {
        throw new NotImplementedException();
    }
}

不会发生错误,如果我用它构建一个对象,

cookie
将返回“1”。

但是如果我用这个连接到互联网,我将不会在

NetworkConnectionConnectivityChanged
方法中收到通知。

这是正确的通知方式吗?

如果是的话,我的错在哪里?

c# .net windows winapi networking
1个回答
0
投票

您将错误的指南传递给

FindConnectionPoint()

您使用的 guid

DCB00001-570F-4A9B-8D69-199FDBA5723B
INetworkListManagerEvents
的 IID,而不是您已实现的
INetworkConnectionEvents

INetworkConnectionEvents
的正确IID是
DCB00007-570F-4A9B-8D69-199FDBA5723B

您的班级还应该实现

INetworkListManagerEvents
,其中有一个
ConnectivityChanged
事件。

© www.soinside.com 2019 - 2024. All rights reserved.