First easiest but does not get every window:
foreach (Process pList in Process.GetProcesses())
{
	string mainWindowTitle = pList.MainWindowTitle.Trim();
	if (!string.IsNullOrWhiteSpace(mainWindowTitle))
	{
		Console.WriteLine(mainWindowTitle);
	}
}
Second:
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using HWND = System.IntPtr;

namespace ListWindowsTitles
{
  /// <summary>Contains functionality to get all the open windows.</summary>
  public static class OpenWindowGetter
  {
    /// <summary>Returns a dictionary that contains the handle and title of all the open windows.</summary>
    /// <returns>A dictionary that contains the handle and title of all the open windows.</returns>
    public static IDictionary<HWND, string> GetOpenWindows()
    {
      HWND shellWindow = GetShellWindow();
      Dictionary<HWND, string> windows = new Dictionary<HWND, string>();

      EnumWindows(delegate(HWND hWnd, int lParam)
      {
        if (hWnd == shellWindow) return true;
        if (!IsWindowVisible(hWnd)) return true;

        int length = GetWindowTextLength(hWnd);
        if (length == 0) return true;

        StringBuilder builder = new StringBuilder(length);
        GetWindowText(hWnd, builder, length + 1);

        windows[hWnd] = builder.ToString();
        return true;

      }, 0);

      return windows;
    }

    private delegate bool EnumWindowsProc(HWND hWnd, int lParam);

    [DllImport("USER32.DLL")]
    private static extern bool EnumWindows(EnumWindowsProc enumFunc, int lParam);

    [DllImport("USER32.DLL")]
    private static extern int GetWindowText(HWND hWnd, StringBuilder lpString, int nMaxCount);

    [DllImport("USER32.DLL")]
    private static extern int GetWindowTextLength(HWND hWnd);

    [DllImport("USER32.DLL")]
    private static extern bool IsWindowVisible(HWND hWnd);

    [DllImport("USER32.DLL")]
    private static extern IntPtr GetShellWindow();
  }
}
Download from here.