Autor Beitrag
Gachl
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 21.06.08 20:56 
Hallo,

ich versuche gerade ein Programm zu schreiben, welches einem die umliegenden WLan Netzwerke mit SSID und vielleicht auch Signalstärke (in dB) anzeigt. Ich habe im Internet nach irgendwelchen Codesnippets betreffend WLan und C# gesucht aber bin leider auf nichts brauchbares gefunden.
Hat schon irgendjemand hier erfahrung damit gemacht oder weiss wo man sich eventuell schlau darüber machen könnte?

Grüsse,
Gachl
Greenberet
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 339
Erhaltene Danke: 20

Win 10
C# (VS 2012), C++ (VS 2012/GCC), PAWN(Notepad++), Java(NetBeans)
BeitragVerfasst: Sa 21.06.08 22:57 
ich glaub mit .NET selbst wirst du da nicht weit kommen( auch wenn ich mich mit wlan und .net noch nicht auseinander gesetzt hab )
schau dir mal die WlanScan Funktion an und bind sie mit PInvoke ein
Gachl
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 22.06.08 12:52 
Danke für die Antwort, ich bin mir sicher, dass das funktionieren würde, wenn ich irgendwie die pInterfaceGuid rausbekommen würde.
Ich hab mir auch überlegt eine c++-Dll zu schreiben, die mir quasi die WlanAPI Funktionen ein wenig C# freundlicher macht, aber bevor ich mich da zu doll reinsteiger wollt ich nochmal nachfragen ob das eine intelligente Lösung ist oder ob es da andere, vielleicht einfachere Lösungen gibt, wie z.B. schon vorhandene DLLs die man verwenden kann?
Greenberet
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 339
Erhaltene Danke: 20

Win 10
C# (VS 2012), C++ (VS 2012/GCC), PAWN(Notepad++), Java(NetBeans)
BeitragVerfasst: So 22.06.08 13:02 
user profile iconGachl hat folgendes geschrieben:
Danke für die Antwort, ich bin mir sicher, dass das funktionieren würde, wenn ich irgendwie die pInterfaceGuid rausbekommen würde.

schau dir dazu mal WMI an
Zitat:
Ich hab mir auch überlegt eine c++-Dll zu schreiben, die mir quasi die WlanAPI Funktionen ein wenig C# freundlicher macht, aber bevor ich mich da zu doll reinsteiger wollt ich nochmal nachfragen ob das eine intelligente Lösung ist oder ob es da andere, vielleicht einfachere Lösungen gibt, wie z.B. schon vorhandene DLLs die man verwenden kann?

ich würd auf die dll komplett vergessen und wirklich auf die einzelnen funktionen über PInvoke zugreifen
Gachl
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 22.06.08 14:25 
Okay, ich hab mich versucht, leider habe ich noch recht wenig Erfahrung im Umgang mit pInvokes... Ich hab mir mal folgende Funktion zusammencopypasted:

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
public string GetNetworks()
{
    IntPtr x, pInfoList, clientHandle;
    UInt32 a, b, c;

    a = WlanOpenHandle(1, IntPtr.Zero, out x, out clientHandle); // Wlan handle öffnen
    b = WlanEnumInterfaces(clientHandle, IntPtr.Zero, out pInfoList); // Interfaces holen
    c = WlanCloseHandle(clientHandle, IntPtr.Zero); // Handle schliessen


    Console.WriteLine("WlanOpenHandle return code: " + a); // 0 = Okay, kein Fehler
    Console.WriteLine("Client handle: " + clientHandle.ToString());
    Console.WriteLine("WlanEnumInterfaces return code: " + b); // 0 = Okay, kein Fehler
    Console.WriteLine("WlanCloseHandle return code: " + c); // 0 = Okay, kein Fehler

    // offset reading of the structure
    int c_dwNumberOfItems = Marshal.ReadInt32(pInfoList, 0);
    Console.WriteLine("WLAN_INTERFACE_INFO_LIST.dwNumberOfItems: {0}", c_dwNumberOfItems);
    int c_dwIndex = Marshal.ReadInt32(pInfoList, 4);
    Console.WriteLine("WLAN_INTERFACE_INFO_LIST.dwIndex: {0}", c_dwIndex);

    int ifListStartOffset = 8;
    int ifListItemSize = IntPtr.Size + 512 + 4// IntPtr + WCHAR[256] + Int32

    // GUID
    IntPtr c_InterfaceGuid = Marshal.ReadIntPtr(pInfoList, ifListStartOffset);

    Int32 c_isState = Marshal.ReadInt32(pInfoList, ifListStartOffset + IntPtr.Size + 512);
    Console.WriteLine("Interface state: {0}", c_isState);

    return "Success?";
}

// WlanAPI pInvokes
[StructLayout(LayoutKind.Sequential)]
public struct WLAN_INTERFACE_INFO_LIST
{
    [MarshalAs(UnmanagedType.I4)]
    public int dwNumberOfItems;
    [MarshalAs(UnmanagedType.I4)]
    public int dwIndex;
    [MarshalAs(UnmanagedType.ByValArray)]
    public WLAN_INTERFACE_INFO[] InterfaceInfo;
}

[StructLayout(LayoutKind.Sequential)]
public struct WLAN_INTERFACE_INFO
{
    public IntPtr InterfaceGuid;
    [MarshalAs(UnmanagedType.LPWStr, SizeConst = 256)]
    public String strInterfaceDescription;
    public int isState;
}

[DllImport("wlanapi.dll", SetLastError = true)]
public static extern uint WlanOpenHandle(int dwClientVersion, IntPtr pReserved, out IntPtr pdwNegotiatedVersion, out IntPtr phClientHandle);

[DllImport("wlanapi.dll", SetLastError = true)]
public static extern uint WlanCloseHandle(IntPtr hClientHandle, IntPtr pReserved);

[DllImport("wlanapi.dll", SetLastError = true)]
public static extern uint WlanEnumInterfaces(IntPtr hClientHandle, IntPtr pReserverd, out IntPtr ppInterfaceList);

[DllImport("wlanapi.dll", SetLastError = true)]
private static extern int WlanScan(IntPtr hClientHandle,IntPtr pInterfaceGuid,IntPtr pDot11Ssid, IntPtr pIeData, IntPtr pReserved);

Funktioniert erstaunlicher Weise, es kommt das richtige Interface und die return codes sind 0, daraus schliesse ich mal, dass kein Fehler entstanden ist. Aber ich hab noch Probleme die Funktion WlanScan einzubinden. Mittlerweile habe ich ja die richtige GUID für das Interface (c_InterfaceGuid), dass ich jetzt wenigstens den Teil richtig füllen kann, aber wo bekomm ich die PWLAN_RAW_DATA pIeData her?
Bin da ein wenig hilflos :(