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);
    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
        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!