Как Raymond Chen выразился некоторое время назад, если Вы думаете о пределах дескриптора окна, Вы, вероятно, делаете что-то не так :)
Так или иначе я держал пари, что нет никакого специального способа C# сделать это, потому что это является очень определенным для системы. Можно использовать те же функции, которые Вы использовали бы в приложении C++. Вызовите функции с помощью P/Invoke. Чтобы изучить, как записать импорт, перейдите к pinvoke.net.
Править: Поскольку я понимаю Ваш вопрос, я предполагаю, что Вы уже знаете, как сделать это в приложении Win32.
Если Вы будете читать сообщение Raymond Chen, то Вы, вероятно, найдете его столь раздражающим, как я сделал. Вы только, "вероятно, делаете что-то не так", потому что Вы делаете что-то, к чему Windows не способен.
В моем приложении, в первый раз, когда пользователь посещает вкладку, я создаю и размечаю все средства управления на той странице. Это занимает значимое количество времени - на странице может легко быть 50 средств управления. Таким образом, я не отбрасываю средства управления на вкладке после заполнения его, если это вообще возможно, и отпуск заключительные наборы вкладок до пользователя.
Как это происходит, некоторые пользователи никогда не хотят закрыть любые наборы вкладок. Почему я должен вынуждать их к? С моим UI они могут перейти очень быстро к любому из 300 + наборы транзакций, что они ответственны за управление. Их машины достаточно быстры, и имеют достаточно памяти, для создания этого всего очень быстро реагирующим. Единственная проблема состоит в том, что Windows не может поддерживать его.
Почему я использую средства управления и не некоторую другую технологию UI? Поскольку они работают. Я должен поддерживать события фокуса, порядок вкладки, события проверки, динамическое расположение и привязку данных - пользователи на самом деле управляют тысячами записей, в десятках таблиц, в DataSet в оперативной памяти. Объем разработки, которую я должен был бы сделать к - говорит - реализуют что-то с помощью средств управления без окон, является астрономическим.
Я только "делаю его неправильно", потому что Windows имеет жесткий предел количества дескрипторов окна, которые это может поддерживать. Тот жесткий предел основан на наборе старых десятилетием предположений о том, как мог бы быть создан UI компьютера. Это не я, кто "делает что-то не так".
Во всяком случае мое решение этого находится в двух частях.
Во-первых, класс, который может сказать Вам, сколько окно обрабатывает Ваш процесс, использует:
using System;
using System.Runtime.InteropServices;
namespace StreamWrite.Proceedings.Client
{
public class HWndCounter
{
[DllImport("kernel32.dll")]
private static extern IntPtr GetCurrentProcess();
[DllImport("user32.dll")]
private static extern uint GetGuiResources(IntPtr hProcess, uint uiFlags);
private enum ResourceType
{
Gdi = 0,
User = 1
}
public static int GetWindowHandlesForCurrentProcess(IntPtr hWnd)
{
IntPtr processHandle = GetCurrentProcess();
uint gdiObjects = GetGuiResources(processHandle, (uint)ResourceType.Gdi);
uint userObjects = GetGuiResources(processHandle, (uint)ResourceType.User);
return Convert.ToInt32(gdiObjects + userObjects);
}
}
}
Во-вторых, я поддерживаю последний использованный кэш своих объектов вкладки. Платформа.NET не обеспечивает универсальный класс кэша LRU, таким образом, я создал один, который можно получить здесь при необходимости в том. Каждый раз, когда пользователь посещает вкладку, я добавляю его к Кэшу LRU. Затем я проверяю, чтобы видеть, испытываю ли я нехватку дескрипторов окна. Если я, я выбрасываю средства управления на последней использованной вкладке и продолжаю делать это, пока у меня нет достаточного количества дескрипторов окна снова.
Полная кавычка, к которой обращается OregonGhost,
Если необходимо спросить, Вы, вероятно, делаете что-то не так.
Это от того, Почему предел окна, обрабатывает 10,000 для каждого процесса? Необходимо считать это.