Wifi信号强度基本到德尔福转换

时间:2009-12-11 19:24:33

标签: delphi

有人可以将此转换为Delphi 2010吗?在无法找到delphi代码以返回WiFi信号强度后,我找到了这个基本代码。有人可以将其转换为Delphi吗?

'**************************************
' Name: WiFi Signal Strength
' Description:Returns the Wifi signal st
'     rength in bars (1 to 5, 5 being good)
' By: Techni Rei Myoko
'
'This code is copyrighted and has' limited warranties.Please see http://w
'     ww.Planet-Source-Code.com/vb/scripts/Sho
'     wCode.asp?txtCodeId=71872&lngWId=1'for details.'**************************************

Option Explicit
Public WiFiHardwareName As String, WiFiDecibals As Long
Dim objWMIService As Object, isSet As Boolean   
Public Declare Function InternetGetConnectedState Lib "wininet.dll" (ByRef lpdwFlags As Long, ByVal dwReserved As Long) As Long

Public Enum ConnectedState
    INTERNET_CONNECTION_MODEM = &H1
    INTERNET_CONNECTION_LAN = &H2
    INTERNET_CONNECTION_PROXY = &H4
    INTERNET_CONNECTION_MODEM_BUSY = &H8
    INTERNET_RAS_INSTALLED = &H10
    INTERNET_CONNECTION_OFFLINE = &H20
    INTERNET_CONNECTION_CONFIGURED = &H40
End Enum

Public Function WifiSignalStrength(Optional Computer As String = ".") As Long   
    On Error Resume Next
    Dim colItems As Object, objItem As Object
    WifiSignalStrength = IIf(isConnected, 5, 0)

    If Not isSet Then
        Set objWMIService = GetObject("winmgmts:\\" & Computer & "\root\wmi")
        isSet = True
    End If

    Set colItems = objWMIService.ExecQuery("Select * From MSNdis_80211_ReceivedSignalStrength")

    For Each objItem In colItems
        WiFiDecibals = objItem.NDIS80211ReceivedSignalStrength
        WiFiHardwareName = objItem.InstanceName

        Select Case WiFiDecibals
            Case 0: WiFiHardwareName = "Ethernet"
            Case Is > -57: WifiSignalStrength = 5 ' -56 To 0
            Case Is > -68: WifiSignalStrength = 4 '-67 To -57
            Case Is > -72: WifiSignalStrength = 3 '-71 To -68
            Case Is > -80: WifiSignalStrength = 2 '-79 To -72
            Case Is > -90: WifiSignalStrength = 1 '-89 To -80
            Case Else: WifiSignalStrength = 0
        End Select   
Next

End Function

'Connection

Public Function isConnected() As Boolean

    Dim dwFlags As Long, retval As Long
    retval = InternetGetConnectedState(dwFlags, 0&)
    isConnected = retval = 1
End Function

2 个答案:

答案 0 :(得分:7)

转到Angus Johnson的website并下载MagWMI(免费软件)。它包含用于直接从Delphi查询WMI的Delphi函数,演示应用程序应该允许您在计算机上测试SELECT并查看结果,并向您展示如何通过自己的代码以编程方式执行此操作。 (我必须在MagWMI.pas中更改两个过程声明的版本,以便将两个WideString参数更改为简单字符串,以便在D2010下进行编译。)

或者,您可以导入W​​indows WMI脚本库(组件|导入组件|导入类型库,并搜索“WBEM”),并使用Delphi在导入过程中为您创建的类。

最后,您可以使用ComObj单元并使用CreateOleObject()函数返回OleVariant,使用它来执行查询,并处理使用OleVariants和SafeArrays进行迭代的混乱。我开始为你写这篇文章,并认为这不好。 &LT g取代;

MagWMI单元将您发布的所有代码更改为几个语句,类似于此(几乎从MagWMI演示中获取,我无法使用您的精确选择,因为此桌面上没有无线):< / p>

var
  Select: string;
  WMIResults := T2DimStrArray;   // MagWMI defined two dimensional string array
  Instances, Rows, i, j: Integer;
begin
  Select := 'SELECT * FROM Win32_OperatingSystem"';
  Rows := MagWMIGetInfo('', 'root\CIMV2', '', '', Select, WMIResults, Instances);
  if Rows > 0 then
  begin
    if Instances >= ListView1.Columns.Count then
      Instances := ListView1.Columns.Count - 1;
    for J := 0 to Instances do
      ListView1.Columns.Items[j].Caption := WMIResults[j, 0];
    for i := 1 to Rows do
    begin
      with ListView1.Items.Add do
      begin
        Caption := WMIResults[0, i];
        for j := 0 to Instances do
          SubItems.Add(WMIResults[j, i]);
      end;
    end;
  end;
end;

上面的代码产生类似的输出(有更多行):

Instance              1
========              ====================
BootDevice            \Device\HarddiskVolume1
BuildNumber           2600
BuildType             Multiprocessor Free
Caption               Microsoft Windows XP Professional
CodeSet               1252
// Snip about 50 more lines

答案 1 :(得分:3)

不要寻找wifi,为WMi做。

使用WMI,您可以获得有关计算机大量元素的信息,包括无线网络。

此组件可以帮助您,它可以与Delphi 2010一起使用。

http://www.magsys.co.uk/delphi/magwmi.asp