C# 使用InternetGetConnectedState检查internet连接始终为true

C# 使用InternetGetConnectedState检查internet连接始终为true,c#,compact-framework,C#,Compact Framework,我需要检查我的Compact Framework应用程序是否具有internet连接 因此,环顾四周,我找到了InternetGetConnectedState方法,但在我的例子中,每次检查是否有internet连接时,它都会返回true,即使在我脱机时也是如此 代码如下: [DllImport("wininet.dll", CharSet = CharSet.Auto)] private extern static bool InternetGetConnectedState(ref Inte

我需要检查我的Compact Framework应用程序是否具有internet连接

因此,环顾四周,我找到了
InternetGetConnectedState
方法,但在我的例子中,每次检查是否有internet连接时,它都会返回true,即使在我脱机时也是如此

代码如下:

[DllImport("wininet.dll", CharSet = CharSet.Auto)]
private extern static bool InternetGetConnectedState(ref InternetConnectionState_e lpdwFlags, int dwReserved);

[Flags]enum InternetConnectionState_e : int
{
    INTERNET_CONNECTION_MODEM = 0x01,
    INTERNET_CONNECTION_LAN = 0x02,
    INTERNET_CONNECTION_PROXY = 0x04,
    INTERNET_RAS_INSTALLED = 0x10,
    INTERNET_CONNECTION_OFFLINE = 0x20,
    INTERNET_CONNECTION_CONFIGURED = 0x40
}

public Form1()
{
    InitializeComponent();
    verify();
}

private void verify()
{
    // In function for checking internet
    InternetConnectionState_e flags = 0;
    bool isConnected = InternetGetConnectedState(ref flags, 0);
    textBox1.Text = "Con: " + isConnected.ToString();
    textBox1.Text += "\r\nDescr: " + flags.ToString();
}

private void button1_Click(object sender, EventArgs e)
{
    verify();
}

private void button2_Click(object sender, EventArgs e)
{
    this.Close();
}
我做错了什么?

看起来你的签名可能有点不对劲

从上面的链接复制时,签名似乎在寻找
int
作为第一个参数:

[DllImport("wininet.dll", SetLastError=true)]
extern static bool InternetGetConnectedState( out int lpdwFlags Description, int dwReserved );

[Flags]
enum ConnectionStates
{
    Modem = 0x1,
    LAN = 0x2,
    Proxy = 0x4,
    RasInstalled = 0x10,
    Offline = 0x20,
    Configured = 0x40,
}
示例代码用法似乎非常简单:

using System;
using System.Runtime.InteropServices;

namespace ConsoleApplication2
{
  internal class Program
  {
   [DllImport("wininet.dll", SetLastError = true)]
   private static extern bool InternetGetConnectedState(out int lpdwFlags, int dwReserved);

   private static void Main(string[] args)
   {
    int flags;
    bool isConnected = InternetGetConnectedState(out flags, 0);
    Console.WriteLine(string.Format("Is connected :{0} Flags:{1}", isConnected, flags));
   }
  }
}
你犯了什么错误?您可以始终将
InternetGetConnectedState
方法包装在
try…catch
块中:

   private static void Main(string[] args)
   {
    int flags;
    bool isConnected = false;
    try
    {
      isConnected = InternetGetConnectedState(out flags, 0);
    } catch (Exception err)
    {
      Console.WriteLine(err.Message);
    }
    Console.WriteLine(string.Format("Is connected :{0} Flags:{1}", isConnected, flags));
   }
  }
希望有帮助

根据您的
标志=18
结果更新:

flags
定义为
int
,因此18是十进制表示

在二进制中,这将是
0001 0010
,它将映射到
LAN(0x2)| RasInstalled(0x10)

所以,我猜你是通过局域网连接的,但这并不保证局域网可以访问互联网。要测试这一点,您需要尝试浏览到一个已知的好站点

RAS我不确定


请记住:安装在充电器中的设备也可能注册为已连接。

当您说您处于“脱机”状态时,您的本地系统是否明确处于脱机状态?这就是这个电话的离线含义。据我所知,检测你是否可以访问互联网的唯一可靠方法是尝试一下,看看是否失败。是的。你想连接到什么?你能连接到它吗?如果没有,那么假设你没有连接。好的,我希望找到一种方法知道我的手机是否连接到互联网。感谢您的评论我尝试了一下,当我在线和离线时都会得到相同的结果:isConnected=true和Flags=18
Flags=18
看起来您已经连接了。看到我更新的答案。好的,但在我的情况下,它总是给我18作为结果。我每次都会浏览谷歌,当我连接时,当我不连接时,它会给出相同的结果(总是在停靠之外)。我们这里所有的工作设备都可以连接到我们的局域网,但它们没有连接到互联网。不确定,但我认为这是由我们的网络管理员通过组策略设置完成的。