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

2024-04-03

我想在C#中获取当前窗口句柄数和系统范围的窗口句柄限制。我该怎么办?


如果你读过 Raymond Chen 的帖子,你可能会像我一样觉得它很烦人。您只是“可能做错了什么”,因为您正在做 Windows 无法完成的事情。

在我的应用程序中,当用户第一次访问选项卡页时,我会创建并布置该页面上的所有控件。这需要相当长的时间 - 一个页面上很容易就有 50 个控件。因此,如果可能的话,我不会在填充选项卡页后丢弃该选项卡页上的控件,并将关闭选项卡页集留给用户。

事实上,有些用户永远不想关闭any标签页集。我为什么要强迫他们?通过我的 UI,他们可以非常快速地导航到他们负责管理的 300 多组事务中的任何一组。他们的机器足够快,并且有足够的内存,使这一切都非常敏感。唯一的问题是 Windows 不支持它。

为什么我使用控件而不是其他 UI 技术?因为他们work。我需要支持焦点事件、选项卡顺序、验证事件、动态布局和数据绑定 - 用户实际上是在内存数据集中管理数十个表中的数千条记录。比如说,使用无窗口控件实现一些东西,我需要做的开发工作量是天文数字。

我只是“做错了”,因为 Windows 对它可以支持的窗口句柄的数量有严格的限制。这个硬性限制是基于一系列十年前关于如何构建计算机用户界面的假设。 “做错事”的不是我。

无论如何,我的解决方案分为两部分。

首先,一个类可以告诉您进程正在使用多少个窗口句柄:

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 http://csharp-lru-cache.googlecode.com如果你需要的话。每次用户访问标签页时,我都会将其添加到 LRU 缓存中。然后我检查一下窗口句柄是否不足。如果是的话,我会丢弃最近最少使用的选项卡页上的控件,并继续这样做,直到再次拥有足够的窗口句柄。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在.NET 中获取当前窗口句柄计数和窗口句柄限制? 的相关文章

随机推荐

  • C 线程编程 - 增加共享变量

    嘿伙计们 所以我正在尝试温习我的 C 线程 我发现的一个问题是 给定一个全局变量 int x 0 实现函数 void 无用 int n 它创建 n 个线程 在循环中将 x 加 1 每个线程在 x 达到 100 时终止 我只是没有掌握线程 需
  • 在结账页面和 WooCommerce 数据字段中添加取货地点自定义字段

    我在另一个类似问题的答案中找到了以下解决方案 根据 WooCommerce 中的自定义字段值将文本添加到订单摘要 https stackoverflow com questions 45906636 add text to order su
  • 如何将多列传递给php中的变量

    我正在开发一个项目 该项目需要将多个列内容传递给 php 变量 我能够选择一列内容并将其传递给变量 但在多列上失败 myEMPNEM sqlNEM SELECT first name middle name last name job ti
  • 如何在PowerShell中将数据导出为CSV?

    foreach computer in computerlist if Test Connection Cn computer BufferSize 16 Count 1 ea 0 quiet foreach file in REMOVE
  • 取消选中所有使用 *ngFor 创建的复选框

    我有一个表 其中有一列 其中每行包含一个复选框 使用 ngFor 单击按钮后 我想取消选中所有复选框 我尝试使用 ngModel boxChecked 对于每个复选框 并在我的按钮单击调用的方法中将该值设置为 false 但这会导致每当我仅
  • AngularJS 无法在发布模式下工作(缩小)

    我的项目中有 AngularJS 和 Bootstrap 的 Angular 指令 这两个指令都是通过 Nuget 添加的 When 编译调试 真 一切都很好 但是一旦我改变了编译调试 to false Angular 停止工作 并且我在
  • Objective-C 中的 __OBJC__

    什么是 OBJC 在 Objective C 中是什么意思 import
  • 如何在textBlock上设置点击效果并打开新的WPF窗口?

    您好 我是 WPF 新手 我正在努力学习它 所以现在我想知道如何在列表框中的文本块上创建 onclick 效果 我想单击列表框中的任何项目并打开一个新窗口 我一定做错了什么 但我不知道那是什么 到目前为止我有以下内容
  • 如何在Android WebView中获取加载的网页标题?

    我在应用程序中使用 WebView 我需要根据用户所在的页面更改应用程序标题 我怎样才能在 Android WebView 中做到这一点 我通过以下行在 iPhone 中执行此操作 self title webPage stringByEv
  • 如何在 C# 中截断列表?

    我知道在 python 中你可以做类似的事情myList 1 20 但是C 中有类似的东西吗 var itemsOneThroughTwenty myList Take 20 var itemsFiveThroughTwenty myLis
  • 无法将 8 位地址移至 16 位寄存器

    我正在尝试分配变量来注册 代码如下 ORG 100h var1 DB 10 var2 DB 20 MOV BX var1 error operands do not match 16 bit register and 8 bit addre
  • 查询合并连续时间记录

    我有一个这样的表 id START DATE end date 1 01 01 2011 01 10 2011 2 01 11 2011 01 20 2011 3 01 25 2011 02 01 2011 4 02 10 2011 02
  • 隐藏打印文本

    我这里有一个打印页 如何隐藏底部显示 关闭窗口 和 打印页面 的链接 使其不被打印在打印页面上 你可以使用CSS media 规则 http www w3 org TR CSS21 media html为了这 首先 添加一个类noprint
  • 网页抓取 - 如何通过 Angular.js 访问在 JavaScript 中呈现的内容?

    我正在尝试从公共网站抓取数据asx com au http www asx com au 这一页http www asx com au asx research company do ACB details http www asx com
  • 如何使用 Ruby 和 MongoId 正确保存时区?

    如果这是一个菜鸟问题 请原谅 我有一个应用程序 用户可以在其个人资料中设置自己的时区 当有人添加阵容 应用程序特定术语 时 我会执行以下操作 time ActiveSupport TimeZone new user timezone par
  • 如何运行媒体流

    我创建了一个网络摄像头流 navigator getUserMedia video true function stream videoTag src window URL createObjectURL stream videoTag p
  • 为什么浏览器不支持 PUT 和 DELETE 请求?何时支持?

    我最近看到许多框架决定在表单提交 而不是ajax 中 伪造 PUT 和 DELETE 请求 就像 Ruby on Rails 一样 他们似乎在等待浏览器迎头赶上 他们的等待是徒劳的吗 这是否会在任何地方实施 Browsers支持PUT an
  • 如何在 Python 中格式化具有可变位数的数字?

    假设我想显示数字 123 并在前面添加可变数量的填充零 例如 如果我想以 5 位数字显示它 我会digits 5给我 00123 如果我想以 6 位数字显示它 我会digits 6 giving 000123 我将如何在 Python 中做
  • 如何将调试器附加到 IIS 而不是 ASP.NET 开发服务器?

    我有一个 ASP NET 网站 当我按 F5 时 它会自动附加到 ASP NET 开发服务器 当我按 F5 时 如何附加到 IIS 工作进程 调试 gt 附加到进程 选择aspnet wp exe从列表中进行处理 如果你正在跑步IIS gt
  • 如何在.NET 中获取当前窗口句柄计数和窗口句柄限制?

    我想在C 中获取当前窗口句柄数和系统范围的窗口句柄限制 我该怎么办 如果你读过 Raymond Chen 的帖子 你可能会像我一样觉得它很烦人 您只是 可能做错了什么 因为您正在做 Windows 无法完成的事情 在我的应用程序中 当用户第