Code: Select all
#Requires AutoHotkey v2
MsgBox GetLocalIPByAdapter('Wifi') ; <— specify the adapter name you are interested in
GetLocalIPByAdapter(adapterName) {
wmi := ComObjGet('winmgmts:')
adapters := wmi.InstancesOf('Win32_NetworkAdapter where NetConnectionID = "' . adapterName . '"')
if adapters.Count {
adapter := adapters.ItemIndex(0)
return wmi.InstancesOf(
'Win32_NetworkAdapterConfiguration where InterfaceIndex = "' . adapter.InterfaceIndex . '"'
).ItemIndex(0).IPAddress[0]
}
return '"' . adapterName . '" not found'
}
It's faster and less resource intensive that way:
Code: Select all
#Requires AutoHotkey v2
MsgBox GetLocalIPByAdapter('Wifi') ; <— specify the adapter name you are interested in
GetLocalIPByAdapter(adapterName) {
static ERROR_BUFFER_OVERFLOW := 111, NI_MAXHOST := 0x401, AF_INET := 2, NI_NUMERICHOST := 2
DllCall('Ws2_32\WSAStartup', 'UShort', 0x0202, 'Ptr', buf := Buffer(512))
res := DllCall('Iphlpapi\GetAdaptersAddresses', 'Int', AF_INET, 'UInt', 0, 'Ptr', 0, 'Ptr', 0, 'UIntP', &size := 0)
if res != ERROR_BUFFER_OVERFLOW {
DllCall('Ws2_32\WSACleanup')
return 'The GetAdaptersAddresses() function failed with an error: ' . res
}
buf := Buffer(size, 0)
DllCall('Iphlpapi\GetAdaptersAddresses', 'Int', AF_INET, 'UInt', 0, 'Ptr', 0, 'Ptr', buf, 'UIntP', &size)
addr1 := buf.ptr ; IP_ADAPTER_ADDRESSES
Loop {
found := StrGet(NumGet(addr1 + 8 + A_PtrSize * 8, 'Ptr')) = adapterName
} until found || !addr1 := NumGet(addr1 + 8, 'Ptr')
if found {
addr2 := NumGet(addr1 + 8 + A_PtrSize * 2, 'Ptr') ; IP_ADAPTER_UNICAST_ADDRESS
SOCKET_ADDRESS := NumGet(addr2 + 8 + A_PtrSize, 'Ptr')
len := NumGet(addr2 + 8 + A_PtrSize * 2, 'UInt')
ipAddressBuf := Buffer(NI_MAXHOST, 0)
res := DllCall('Ws2_32\getnameinfo', 'Ptr', SOCKET_ADDRESS, 'UInt', len,
'Ptr', ipAddressBuf, 'UInt', NI_MAXHOST,
'Ptr', 0, 'UInt', 0, 'Int', NI_NUMERICHOST)
info := res == 0 ? StrGet(ipAddressBuf, 'CP0') : 'The getnameinfo() function failed with an error: ' . res
}
DllCall('Ws2_32\WSACleanup')
return info ?? '"' . adapterName . '" not found'
}