[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;
}
None.
None.
Please add some!
GUITHREADINFO threadInfo = new GUITHREADINFO();
threadInfo.cbSize = Marshal.SizeOf( threadInfo );
GetGUIThreadInfo( 0, ref threadInfo );
// 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;
}
// 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);
}
}
}
}
Do you know one? Please contribute it!