Getting the Name of your Windows Phone 8 device

You can name your phone to whatever you like, but how can an app display that name? There isn't an obvious API for this, but I accidentally discovered an un-obvious API. The quick version is that you can ask getaddrinfo for the canonical network name. Too quick? OK, here is some C++/CX code to show exactly:

 Platform::String ^ DeviceName::PhoneName::get()
{
    WSADATA wsadata;
    ADDRINFOA *result = nullptr;
    int error;
    wchar_t wszName[256] = L"Unknown";
    ADDRINFOA hints = {};
 
    hints.ai_flags = AI_CANONNAME;
 
    error = WSAStartup(MAKEWORD(2,2), &wsadata);
    if (error==0)
    {
        error = ::getaddrinfo("", "0", &hints, &result);
        if (error==0)
        {
            char *name = result->ai_canonname;
            if (name!=nullptr)
            {
                MultiByteToWideChar(CP_ACP, 0, name, strlen(name), wszName, 256);
            }
        }
    }
 
    ::freeaddrinfo(result);
 
    return ref new Platform::String(wszName);
}

If you haven't used C++/CX on the phone you might need a little more info on how to hook this up, so here is the C++/CX Super-QuickStart guide by me:

Load your C# project into VS2012. Right click on the Solution then Add / New Project / Visual C++ / Windows Phone / Windows Phone Runtime Component and call it NetHelper.

In pch.h add:

 #include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>

Replace NetHelper.h with this simple ref class containing a single static property:

 #pragma once
 
namespace NetHelper
{
    public ref class DeviceName sealed
    {
    public:
        static property Platform::String ^ PhoneName
        {
            Platform::String ^ get();
        }
    };
}

Replace NetHelper.cpp with the code at the start of the article, prefixed with this:

 #include "pch.h"
#include "NetHelper.h"
 
using namespace NetHelper;
using namespace Platform;
 
#pragma comment(lib, "ws2_32.lib")

Build the NetHelper project.

Right click on your C# project's References tree / Add Reference / Solution / add a checkmark next to NetHelper / OK

In C# you can now using it with

 var name = NetHelper.DeviceName.PhoneName;

That's it!