Открываем .NET Reflector и смотрим, как это сделано в CLR Код (Text): public IntPtr FindMainWindow(int processId) { this.bestHandle = IntPtr.Zero; this.processId = processId; NativeMethods.EnumThreadWindowsCallback callback = new NativeMethods.EnumThreadWindowsCallback(this.EnumWindowsCallback); NativeMethods.EnumWindows(callback, IntPtr.Zero); GC.KeepAlive(callback); return this.bestHandle; } private bool EnumWindowsCallback(IntPtr handle, IntPtr extraParameter) { int num; NativeMethods.GetWindowThreadProcessId(new HandleRef(this, handle), out num); if ((num == this.processId) && this.IsMainWindow(handle)) { this.bestHandle = handle; return false; } return true; } private bool IsMainWindow(IntPtr handle) { return (!(NativeMethods.GetWindow(new HandleRef(this, handle), 4) != IntPtr.Zero) && NativeMethods.IsWindowVisible(new HandleRef(this, handle))); } В нативный код сам переведешь, я думаю? Не очень, конечно, способ смотрится, но есть ли лучше - фз.