用户对象

用户界面对象只支持每个对象一个句柄。 进程无法继承或复制用户对象的句柄。 一个会话中的进程不能引用另一个会话中的用户句柄。

理论限制为每个会话65536个用户句柄。 但是,每个会话可以打开的用户句柄的最大数量通常较低,因为它受可用内存的影响。 用户句柄的每个进程的默认限制也是默认值。 若要更改此限制,请设置以下注册表值:

HKEY _本地 _ 计算机 \ 软件 \ Microsoft \ windows NT \ CurrentVersion \ windows \ USERProcessHandleQuota

此值可设置为介于200和18000之间的数字。

用户对象的句柄

用户对象的句柄对于所有进程都是公共的。 也就是说,任何进程都可以使用用户对象句柄,前提是该进程具有对对象的安全访问权限。

在下图中,应用程序创建了一个窗口对象。 CreateWindow函数创建窗口对象并返回对象句柄。

应用程序创建窗口对象

创建窗口对象后,应用程序可以使用窗口句柄来显示或更改窗口。 句柄保持有效,直到窗口对象被销毁。

在下图中,应用程序会销毁窗口对象。 DestroyWindow函数从内存中删除窗口对象,这会使窗口句柄失效。

销毁窗口对象

管理用户对象

下表列出了用户对象,以及每个对象的 creator 和 destroyer 函数。 Creator 函数创建对象和对象句柄,或者只返回现有的对象句柄。 Destroyer 函数将对象从内存中删除,从而使对象句柄失效。

用户对象 Creator 函数 Destroyer 函数
快捷键对应表 CreateAcceleratorTable DestroyAcceleratorTable
西文插入记号 CreateCaret DestroyCaret
游标 CreateCursorLoadCursorLoadImage DestroyCursor
DDE 对话 DdeConnect DdeConnectList DdeDisconnect DdeDisconnectList
挂钩 SetWindowsHookEx UnhookWindowsHookEx
图标 CreateIconIndirectLoadIconLoadImage DestroyIcon
菜单 CreateMenuCreatePopupMenuLoadMenuLoadMenuIndirect DestroyMenu
窗口 CreateWindowCreateWindowExCreateDialogParamCreateDialogIndirectParamCreateMDIWindow DestroyWindow
窗口位置 BeginDeferWindowPos EndDeferWindowPos