易语言编程: 让读屏软件可获取标签控件的文本

易语言编程: 让读屏软件可获取标签控件的文本

将易语言的非标准标签控件修改为标准的标签控件,使屏幕阅读器可获取到标签的内容
在使用易语言创建窗口控件时,我们会发现:易语言的编辑框、组合框、列表框等控件索关联的标签,使用屏幕阅读器无法朗读出该标签的内容,从而导致视障用户无法知道焦点控件的作用
例如我们创建一个窗口程序,在窗口上摆放如下控件:用户名标签、用户名编辑框、性别标签、性别组合框
然后将用户名标签的标题修改为“用户名”,性别标签的标题修改为性别,并将性别组合框的类型更改为“不可编辑下拉式”
然后使用争渡和nvda测试朗读结果
争渡的朗读结果是:可编辑文本,组合框
nvda的朗读结果是:编辑框空白,组合框已折叠
根据上述朗读结果可见,使用争渡和nvda都无法朗读出焦点控件所关联标签的内容,视障用户根本无法知道焦点控件的作用
其主要原因是易语言的标签控件不是标准的windows标准控件,因此屏幕阅读器无法获取到该标签的内容
解决思路:
将易语言的标签(el_label)非标准控件设置为(static)标准控件,使屏幕阅读器能获取该标签的内容
方法如下:
LabelHook模块的创建
1.新建一个LabelHook模块
打开易语言程序,新建一个模块项目,在模块界面点击文件菜单->配置,将模块名称修改为“LabelHook”,然后点击“确认”
2.声名dll
代码如下:
.版本 2
.DLL命令 VirtualProtect, 整数型, "kernel32.dll", "VirtualProtect", , 该函数的功能是在呼叫处理程序的虚拟位置空间里,变更认可页面区域上的保护。
.参数 lpAddress, 整数型, , 目标地址起始位置
.参数 dwSize, 整数型, , 大小
.参数 flNewProtect, 整数型, , 请求的保护方式
.参数 lpflOldProtect, 整数型, 传址, 保存老的保护方式
.DLL命令 GetProcAddress, 整数型, "kernel32", "GetProcAddress", , 该函数的功能是检索指定的动态链接库(DLL)中的输出库函数地址。
.参数 hModule, 整数型, , DLL模块句柄
.参数 lpProcName, 文本型, , 函数名
.DLL命令 GetModuleHandleA, 整数型, "kernel32", "GetModuleHandleA", , 该函数可获取模块句柄
.参数 lpModuleName, 文本型, , 模块名
.DLL命令 CreateWindowEx, 整数型, "user32.dll", "CreateWindowExA", , 该函数用来创建一个具有扩展风格的层叠式窗口
.参数 DdwExStyle, 整数型, , 窗口的扩展风格
.参数 lpClassName, 文本型, , 指向注册类名的指针
.参数 lpWindowName, 文本型, , 指向窗口名称的指针
.参数 dwStyle, 整数型, , 窗口风格
.参数 x, 整数型, , 窗口的水平位置
.参数 y, 整数型, , 窗口的垂直位置
.参数 nWidth, 整数型, , 窗口的宽度
.参数 nHeight, 整数型, , 窗口的高度
.参数 hWndParent, 整数型, , 父窗口的句柄
.参数 hMenu, 整数型, , 菜单的句柄或是子窗口的标识符
.参数 hInstance, 整数型, , 应用程序实例的句柄
.参数 lpParam, 整数型, , 指向窗口的创建数据
创建LabelHook类
代码如下:
.版本 2
.程序集 LabelHook
.程序集变量 私有成员_1, 整数型
.程序集变量 私有成员_2, 逻辑型
.程序集变量 私有成员_3, 字节集
.程序集变量 私有成员_4, 字节集
.子程序 _销毁
offHook ()
.子程序 onHook, 逻辑型, 公开
.局部变量 局_变量, 整数型
.如果真 (私有成员_1 = 0 或 私有成员_2)
返回 (假)
.如果真结束
VirtualProtect (私有成员_1, 5, 64, 局_变量)
写到内存 (私有成员_3, 私有成员_1, 5)
VirtualProtect (私有成员_1, 5, 局_变量, 局_变量)
私有成员_2 = 真
返回 (真)
.子程序 setInfo, 整数型, 公开
.参数 DLL名, 文本型
.参数 函数名, 文本型
.参数 回调, 子程序指针
.如果真 (私有成员_2)
offHook ()
.如果真结束
私有成员_1 = GetProcAddress (GetModuleHandleA (DLL名), 函数名)
私有成员_4 = 指针到字节集 (私有成员_1, 5)
私有成员_3 = { 233 } + 到字节集 (到整数 (到数值 (回调) - 私有成员_1 - 5))
返回 (私有成员_1)
.子程序 offHook, 逻辑型, 公开
.局部变量 局_变量, 整数型
.如果真 (私有成员_1 = 0 或 取反 (私有成员_2))
返回 (假)
.如果真结束
VirtualProtect (私有成员_1, 5, 64, 局_变量) '
写到内存 (私有成员_4, 私有成员_1, 5)
VirtualProtect (私有成员_1, 5, 局_变量, 局_变量)
私有成员_2 = 假
返回 (真)
.子程序 _初始化
私有成员_2 = 假
创建回调函数,供LabelHook类的setInfo所用
在程序及1界面中新建一个回调子程序
代码如下:
.版本 2
.子程序 CALLBACK, 整数型
.参数 参数_1, 整数型
.参数 参数_2, 文本型
.参数 参数_3, 文本型
.参数 参数_4, 整数型
.参数 参数_5, 整数型
.参数 参数_6, 整数型
.参数 参数_7, 整数型
.参数 参数_8, 整数型
.参数 参数_9, 整数型
.参数 参数_10, 整数型
.参数 参数_11, 整数型
.参数 参数_12, 整数型
.局部变量 labelHook, 整数型
.如果真 (参数_2 = “_EL_Label”)
参数_2 = “STATIC”
.如果真结束
labelHook.offHook ()
labelHook = CreateWindowEx (参数_1, 参数_2, 参数_3, 参数_4, 参数_5, 参数_6, 参数_7, 参数_8, 参数_9, 参数_10, 参数_11, 参数_12)
labelHook.onHook ()
返回 (labelHook)
创建setLabel函数,供其它易语言程序调用
首先在程序及1界面声明一个程序及变量,变量名是labelHook,变量类型是LabelHook
然后创建setLabel函数,注:需将setLabel的公开属性选中,以供其它易语言项目调用
setLabel函数代码如下:
.版本 2
.子程序 setLabel, 逻辑型, 公开,
.如果真 (labelHook.setInfo (“user32.dll”, “CreateWindowExA”, &CALLBACK) = 0)
返回 (假)
.如果真结束
返回 (labelHook.onHook ())
生成模块
代码编写完成后我们就可以将代码编译成易语言模块,按下f7或点击编译菜单->编译,弹出保存对话框,将文件名修改为“LebelHook”,浏览一个目录,然后点击保存按钮,就此LabelHook模块编译成功
二、调用LabelHook模块,步骤如下:
修改启动方式
打开易语言程序,点击工具->系统配置,将通过名称为“_启动窗口”的窗口启动程序 修改为:通过名称为“_启动子程序”的子程序启动
暴露出程序入口函数,已供后续使用
摆放窗体控件
在易语言界面点击文件菜单->新建->Windows 空白程序,然后选择Windows窗口程序,创建出一个窗口程序
然后点击“插入”菜单->“窗口”,添加一个空白的窗口,接着开始摆放窗体控件
注:摆放窗体的顺序必须是先摆放焦点控件,然后再摆放焦点控件所关联的标签
如:先摆放一个编辑框,然后再摆放编辑框所关联的标签,这个顺序尤为重要,大家要谨记,否则标签将无法正确朗读
例如我们创建一个窗口程序,在窗口上摆放如下控件:用户名编辑框、用户名标签、性别组合框、性别标签
然后将用户名标签的标题修改为“用户名”,性别标签的标题修改为性别,并将性别组合框的类型更改为“不可编辑下拉式”
载入LabelHook模块
并调用setLabel函数实现将非标准的el_label标签控件修改为static标准标签控件
首先点击程序tab在“模块引用表”上右击弹出菜单选择添加模块引用,浏览到LabelHook模块,点击打开按钮载入该模块
然后切换到“程序及1”,聚焦到“启动子程序”这个函数,在函数的第一行调用setLabel函数,接着就可以载入我们创建的窗口了
代码如下:
.版本 2
.子程序 _启动子程序, 整数型, , 本子程序在程序启动后最先执行
setLabel ()
载入 (窗口1, , 真)
可以点击f5运行该程序,我们再次使用争渡和nvda测试朗读结果
争渡的朗读结果是:用户名可编辑文本,性别组合框
nvda的朗读结果是:用户名编辑框 空白,性别组合框以折叠

源文:《如何使用易语言让屏幕阅读器可获取到标签的内容》: https://mp.weixin.qq.com/s/Rv5yuklnfvUXhqmd-HR6eA

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值