3

如果我的 Compact Framework 应用程序有互联网连接,我需要检查它。

所以环顾四周,我找到了这个InternetGetConnectedState方法,但就我而言,每次我检查我是否有互联网连接时,它都会返回 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();
}

我做错了什么?

4

1 回答 1

4

看起来您的P/Invoke internetgetconnectedstate签名可能有点偏离。

从上面的链接复制,签名似乎寻找一个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));
   }
  }

希望有帮助。

更新根据您的flags = 18结果:

flags被定义为int,所以 18 是十进制表示。

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

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

RAS我不确定。远程访问服务

请记住:支架/停靠在充电器中的设备也可以注册为Connected

于 2013-01-03T14:13:44.680 回答