如何在.NET中获取当前窗口句柄数和窗口句柄限制?

我想获取当前窗口句柄数和C#中的系统范围窗口句柄限制.我该怎么做?
最佳答案
如果你看到陈冯富珍的帖子,你可能会像我一样发现它是恼人的.你只是“可能做错了”,因为你正在做一些Windows不能做的事情.

在我的应用程序中,用户首次访问标签页时,我创建并布置了该页面上的所有控件.这需要大量的时间 – 一个页面上可以轻松地有50个控件.所以我不填写选项卡页面上的控件,如果它是可能的,并留下关闭标签页的集合到用户.

一旦发生这种情况,一些用户就不会想要关闭任何一组标签页.为什么要强迫他们呢?通过我的用户界面,他们可以快速导航到他们负责管理的300套交易中的任何一个.他们的机器足够快,并有足够的记忆,使这一切都非常敏感.唯一的问题是Windows不能支持它.

为什么我使用控件,而不是其他UI技术?因为他们工作我需要支持焦点事件,标签顺序,验证事件,动态布局和数据绑定 – 用户实际上是在内存数据集中管理数十个记录,数十个表.我必须做的开发的数量 – 说 – 使用无窗控件实现某些东西是天文数字的.

我只是“做错了”,因为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缓存类,所以我构建了一个,你可以得到here如果你需要一个.每次用户访问标签页时,我将其添加到LRU缓存.然后我检查看看我是否在窗口手柄上跑低.如果我是,我会把最近最近使用的标签页上的控件丢弃,并继续这样做,直到我再次有足够的窗口句柄.

转载注明原文:如何在.NET中获取当前窗口句柄数和窗口句柄限制? - 代码日志