GetGUIThreadInfo (user32)
Last changed: -168.149.242.175

.
Summary

C# Signature:

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

    [Flags]
    public enum GuiThreadInfoFlags
    {
        GUI_CARETBLINKING = 0x00000001,
        GUI_INMENUMODE = 0x00000004,
        GUI_INMOVESIZE = 0x00000002,
        GUI_POPUPMENUMODE = 0x00000010,
        GUI_SYSTEMMENUMODE = 0x00000008
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct GUITHREADINFO
    {
        public int cbSize;
        public GuiThreadInfoFlags flags;
        public IntPtr hwndActive;
        public IntPtr hwndFocus;
        public IntPtr hwndCapture;
        public IntPtr hwndMenuOwner;
        public IntPtr hwndMoveSize;
        public IntPtr 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, ref 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 IntPtr hwndActive;
        public IntPtr hwndFocus;
        public IntPtr hwndCapture;
        public IntPtr hwndMenuOwner;
        public IntPtr hwndMoveSize;
        public IntPtr 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;
    }

Sample Program:

    // THis program will retrieve the window handle for the current foreground window.
    // Tested on Win7 64 bit.
    // Thanks to this StackOverflow question: http://stackoverflow.com/questions/719825/calling-getguithreadinfo-via-p-invoke

    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