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

Ian*_*oyd 16 delphi accessibility uiaccessibility delphi-xe6

如果用户正在使用屏幕阅读器(例如Microsoft Narrator),并且他们的焦点进入文本框:

在此输入图像描述

他们听到的只是:

编辑文字

同时在无障碍应用中,

  • 例如Microsoft File Explorer
  • 微软Word
  • Microsoft Excel
  • Microsoft Outlook

辅助功能系统能够获得控件的"可访问名称":

在此输入图像描述

批次分隔符.编辑文字

这通过实现IAccessible接口的窗口工作.它通过发送hWnd WM_GETOBJECT消息来获取窗口的IAccessible实现.应用程序永远不会发送此消息:

由Microsoft Active Accessibility和Microsoft UI Automation发送,以获取有关服务器应用程序中包含的可访问对象的信息.

应用程序从不直接发送此消息.Microsoft Active Accessibility发送此消息以响应对AccessibleObjectFromPoint,AccessibleObjectFromEvent或AccessibleObjectFromWindow的调用.

但是我们可以处理消息,并将IAccessible接口返回给调用者:

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

在.NET世界中,它们围绕Edit控件的包装器公开了一种使用Control.AccessibleName属性设置TextBox 的可访问名称的方法:

Control.AccessibleName属性

获取或设置辅助功能客户端应用程序使用的控件的名称.

public string AccessibleName { get; set; }
Run Code Online (Sandbox Code Playgroud)

我不知道底层的Microsoft Edit控件如何公开辅助功能.除了TCustomActionMenuBar之外,我在VCL中找不到任何对IAccessible的引用.

VCL如何公开辅助功能?

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

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

奖金Chatter

可访问项的名称通过只读IAccessible.accName属性返回.

Property  Access Type  Description
--------  -----------  ----------------------------------------------------------
accName   Read-only    The name of the object. All objects support this property.
                       See get_accName.
Run Code Online (Sandbox Code Playgroud)

奖金阅读

Rem*_*eau 8

VCL如何公开辅助功能?

它完全没有.

如果您需要此功能,则必须IAccessible在自己的代码中手动实现与您自己相关的所有内容,然后将VCL控件子类化为响应WM_GETOBJECT消息,就像您在问题中所示.

例如:

在Delphi中创建可访问的UI组件