如何阻止Windows Forms文本框控件被屏幕阅读器识别
屏蔽Windows Forms文本框被屏幕阅读器识别的方案
以下几种方法可以让目标文本框完全不被NVDA等屏幕阅读器识别和交互:
方法一:自定义不可访问的TextBox控件
继承原生TextBox,重写其辅助功能实例,让屏幕阅读器判定该控件不可访问:
public class NonAccessibleTextBox : TextBox { protected override AccessibleObject CreateAccessibilityInstance() { return new NonAccessibleTextBoxAccessibility(this); } private class NonAccessibleTextBoxAccessibility : ControlAccessibleObject { public NonAccessibleTextBoxAccessibility(TextBox owner) : base(owner) { } // 核心设置:告知辅助技术该控件不可访问 public override bool IsAccessible => false; } }
将窗体中原有的TextBox替换为这个自定义控件即可,屏幕阅读器会彻底忽略它,无论用户通过鼠标还是其他方式选中。
方法二:修改控件辅助功能属性(快速临时方案)
如果不想自定义控件,可在窗体初始化或控件的HandleCreated事件中设置以下属性:
textBox1.AccessibleRole = AccessibleRole.None;textBox1.AccessibleName = string.Empty;textBox1.AccessibleDescription = string.Empty;textBox1.TabStop = false;
注意:这种方法在部分场景下可能被屏幕阅读器绕过,可靠性不如自定义控件方案。
方法三:通过Windows API修改窗口属性
使用User32.dll的API修改窗口扩展样式,进一步降低控件被辅助技术识别的概率:
using System.Runtime.InteropServices; public partial class YourForm : Form { [DllImport("user32.dll", SetLastError = true)] private static extern IntPtr SetWindowLongPtr(IntPtr hWnd, int nIndex, IntPtr dwNewLong); [DllImport("user32.dll", SetLastError = true)] private static extern IntPtr GetWindowLongPtr(IntPtr hWnd, int nIndex); private const int GWL_EXSTYLE = -20; private const int WS_EX_TRANSPARENT = 0x00000020; private const int WS_EX_NOACTIVATE = 0x08000000; private void TextBox1_HandleCreated(object sender, EventArgs e) { var textBox = sender as TextBox; if (textBox != null) { // 获取当前窗口扩展样式 var exStyle = GetWindowLongPtr(textBox.Handle, GWL_EXSTYLE); // 添加透明和无激活样式 SetWindowLongPtr(textBox.Handle, GWL_EXSTYLE, (IntPtr)(exStyle.ToInt64() | WS_EX_TRANSPARENT | WS_EX_NOACTIVATE)); } } }
将此代码绑定到目标文本框的HandleCreated事件上即可生效。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

