易语言编程: 让读屏软件可获取标签控件的文本
易語言編程: 讓讀屏軟件可獲取標簽控件的文本
將易語言的非標準標簽控件修改為標準的標簽控件,使屏幕閱讀器可獲取到標簽的內容
在使用易語言創建窗口控件時,我們會發現:易語言的編輯框、組合框、列表框等控件索關聯的標簽,使用屏幕閱讀器無法朗讀出該標簽的內容,從而導致視障用戶無法知道焦點控件的作用
例如我們創建一個窗口程序,在窗口上擺放如下控件:用戶名標簽、用戶名編輯框、性別標簽、性別組合框
然后將用戶名標簽的標題修改為“用戶名”,性別標簽的標題修改為性別,并將性別組合框的類型更改為“不可編輯下拉式”
然后使用爭渡和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
總結
以上是生活随笔為你收集整理的易语言编程: 让读屏软件可获取标签控件的文本的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Lidar360 基本操作
- 下一篇: ISO21434车辆网络安全解读-2.组