如何设置与 TEdit 控件关联的可访问名称?

How to set the Accessible Name associated with a TEdit control?

如果用户正在使用屏幕 reader(例如 Microsoft 讲述人),并且他们的焦点进入文本框:

他们听到的是:

Editing text

同时在可访问的应用程序中,

无障碍系统能够获取控件的 "Accessible Name":

Batch separator. Editing text

这通过 window 实现 IAccessible interface. It obtains a window's implementation of IAccessible by sending the hWnd the WM_GETOBJECT 消息起作用。但是,应用程序从不发送此消息:

Sent by both Microsoft Active Accessibility and Microsoft UI Automation to obtain information about an accessible object contained in a server application.

Applications never send this message directly. Microsoft Active Accessibility sends this message in response to calls to AccessibleObjectFromPoint, AccessibleObjectFromEvent, or AccessibleObjectFromWindow.

但是我们可以处理消息,return一个IAccessible接口给调用者:

case Message.Msg of
WM_GETOBJECT: 
   begin
      if DWORD(Message.LParam) = OBJID_CLIENT then
         Message.Result := LResultFromObject(IAccessible, Message.WParam, FAccessible);
   end;
end;

在 .NET 世界中,他们围绕 Edit control, exposes a way to set the accessible name of an TextBox using the Control.AccessibleName property:

Control.AccessibleName Property

Gets or sets the name of the control used by accessibility client applications.

public string AccessibleName { get; set; }

我不知道底层 Microsoft Edit 控件如何公开辅助功能。除了 TCustomActionMenuBar.

,我在 VCL 中找不到任何对 IAccessible 的引用

VCL 如何公开辅助功能?

如何设置与 TEdit 控件关联的可访问名称?

如何设置与编辑控件关联的可访问名称?

奖金聊天

可访问项目的 名称 return 通过 read-only IAccessible.accName property.

编辑
Property  Access Type  Description
--------  -----------  ----------------------------------------------------------
accName   Read-only    The name of the object. All objects support this property.
                       See get_accName.

红利阅读

How does the VCL expose accessibility features?

完全没有。

如果你想要这个功能,你必须在你自己的代码中手动实现所有与IAccessible相关的东西,然后子类化你的VCL控件来响应WM_GETOBJECT消息,就像你一样显示在你的问题中。

例如:

Creating Accessible UI components in Delphi