GetGUIThreadInfo (user32)
Last changed: -64.47.15.6

.
Summary

C# Signature:

[DllImport("user32.dll")]
static extern bool GetGUIThreadInfo(uint idThread, out GUITHREADINFO lpgui);

    public struct GUITHREADINFO
    {
        public int cbSize;
        public int flags;
        public int hwndActive;
        public int hwndFocus;
        public int hwndCapture;
        public int hwndMenuOwner;
        public int hwndMoveSize;
        public int hwndCaret;
        public System.Drawing.Rectangle rcCaret;
    }

User-Defined Types:

None.

Notes:

None.

Tips & Tricks:

Please add some!

Sample Code:

GUITHREADINFO threadInfo = new GUITHREADINFO();
threadInfo.cbSize = Marshal.SizeOf( threadInfo );

GetGUIThreadInfo( 0, out threadInfo );

Sample Code:

    // Get WIndow Handle From Thread ID
    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool GetGUIThreadInfo(uint idThread, ref GUITHREADINFO lpgui);
    public struct GUITHREADINFO
    {
        public int cbSize;
        public int flags;
        public int hwndActive;
        public int hwndFocus;
        public int hwndCapture;
        public int hwndMenuOwner;
        public int hwndMoveSize;
        public int hwndCaret;
        public System.Drawing.Rectangle rcCaret;
    }

    public int getThreadWindowHandle( uint dwThreadId )
    {
        int hWnd = 0;

        // Get Window Handle and title from Thread
        Win32API.GUITHREADINFO guiThreadInfo = new Win32API.GUITHREADINFO();
        guiThreadInfo.cbSize = Marshal.SizeOf(guiThreadInfo);

        Win32API.GetGUIThreadInfo(dwThreadId, ref guiThreadInfo);

        hWnd = guiThreadInfo.hwndActive;
        return hWnd;
    }

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Runtime.InteropServices;

using System.ComponentModel;

using System.Threading;

namespace GUIThread

{

    [StructLayout(LayoutKind.Sequential)]
    internal struct Rect
    {
    public int Left;
    public int Top;
    public int Right;
    public int Bottom;
    }

    [StructLayout(LayoutKind.Sequential)]
    internal struct GuiThreadInfo
    {
    public int cbSize;
    public uint flags;
    public IntPtr hwndActive;
    public IntPtr hwndFocus;
    public IntPtr hwndCapture;
    public IntPtr hwndMenuOwner;
    public IntPtr hwndMoveSize;
    public IntPtr hwndCaret;
    public Rect rcCaret;
    }

    class Program
    {
    [DllImport("user32.dll", SetLastError = true)]
    internal static extern bool GetGUIThreadInfo(uint idThread, ref GuiThreadInfo lpgui);

    static IntPtr GetFocusedHandle()
    {
        var info = new GuiThreadInfo();
        info.cbSize = Marshal.SizeOf(info);
        if(!GetGUIThreadInfo(0, ref info))
        throw new Win32Exception();
        return info.hwndFocus;
    }

    static void Main(string[] args)
    {
        for(; ; )
        {
        Console.WriteLine("Currently Focused Window: {0}", GetFocusedHandle());
        Thread.Sleep(1000);
        }
    }
    }

}

Alternative Managed API:

Do you know one? Please contribute it!

Documentation