projectDocs/design 與 projectDocs/dev),官方工程師是怎麼設計這套神經網絡的?』」projectDocs/design/technicalDesignOverview.md)的黑盒子!我們不需要去啃硬核的 C++ 或 Python 語法,我們要用最有溫度的白話比喻,解密 NVDA 的五大核心神經(NVDAObject、TextInfo、InputGesture、Event/Script 接力鏈、與 Speech Filter),讓大家徹底搞懂『NVDA 外掛到底是在哪個神經節點上施展魔法的』!」controlTypes.Role.BUTTON 按鈕、Role.EDITABLETEXT 輸入框、Role.PASSWORD 密碼框)。parent)、兄弟是誰(next / previous)、孩子是誰(firstChild)。technicalDesignOverview.md 文件裡最精采的 『接力賽跑鏈(Propagation Chain)』!」event_gainFocus 事件。nextHandler() 把接力棒交給下一棒,否則接力中斷,NVDA 的預設語音就會靜音!NVDA+Shift+P 快捷鍵時。scriptHandler.script) ➔ 在手勢接力鏈的第一棒就把快捷鍵搶過來,執行我們的自訂功能(如番茄鐘、Ping 測試、剪貼簿去格式)。appModules/) ➔ 專門監聽特定軟體(如 notepad.py)的 event_gainFocus,改造無障礙體驗。speech.filter_speechSequence) ➔ 在文字變成聲音前的最後一刻,攔截字串進行點字轉譯、個資打碼或多語系引擎切換。gui.settingsDialogs) ➔ 插入 NVDA 原生設定視窗,讓使用者保存偏好設定至 config.conf。projectDocs/design)的黑盒子完全拆解開了!搞懂了 Python/C++ 雙層結構、NVDAObject 樹狀地圖與接力賽跑鏈,我們現在對 NVDA 外掛的底層原理有了最頂級的宏觀視野!」Name(名稱)、Role(角色,如按鈕/輸入框)、States(狀態,如已勾選)、Location(螢幕座標)、Parent/Next/Previous(樹狀親緣關係)。nextHandler())。👉 下一堂課:Lecture 14 NVDA 2026.1+ 外掛專業 Vibe Coding 大師課(一):基礎架構、manifest.ini 宣告與 4 大入門實戰案例
👉 回課程大綱:學習地圖
以下題目專為尋求真正硬核觀念與專家級實戰能力的學員設計。題目無法從講義表面抄寫解答,請嘗試獨立思考後再點擊展開解析。
【實戰情境問題】:在 NVDA 外掛中,如果我們在 NVDA 的事件回呼函數(如 `event_gainFocus`)中執行了一個耗時 2 秒的網路 HTTP 請求,為什麼整個 Windows 作業系統的螢幕報讀會瞬間卡死?如何透過 `wx.CallAfter` 與背景執行緒修正?
【鑑別點說明】:測試學員對 NVDA 核心單執行緒事件驅動架構 (Single-threaded Event Loop) 與 GUI 執行緒安全 (Thread Safety) 的硬核掌握。
【專家級解答與深度剖析】: NVDA 核心、UI 渲染與 Win32 事件處理共享同一個主事件執行緒。在 `event_gainFocus` 中執行同步 HTTP 請求,會直接阻塞主事件循環(Main Loop)。期間作業系統拋出的所有焦點變更事件均無法被處理,導致 NVDA 徹底停止報讀與響應。正確作法:在獨立的 `threading.Thread` 背景執行緒中發起 HTTP 請求,當取得資料後,調用 `wx.CallAfter(ui.message, result)` 將 UI 更新任務安全排回主執行緒執行。
【實戰情境問題】:當 NVDA 存取一個網頁或桌面應用程式時,NVDA 如何將 Windows 系統原生的 Accessibility API(如 MSAA / UIA / IAccessible2)統一包裝成 NVDA 的 `NVDAObject` 幾何物件?
【鑑別點說明】:深剖 NVDA 抽象物件層(Abstraction Layer)與 Windows 系統底層無障礙 API 的映射機制。
【專家級解答與深度剖析】: Windows 存在多種不同的無障礙底層 API 規範(MSAA 舊架構、UIA 現代架構、IAccessible2 瀏覽器架構)。NVDA 透過工廠模式(Factory Pattern)設計了 `NVDAObject` 抽象基底類別。當焦點改變時,NVDA 底層驅動會根據目標視窗的 ClassName 與 API 類型,實例化出對應的衍生類別(如 `UIA` 物件或 `IA2` 物件),並將各種異構 API 的屬性(如 UIA Name / IAccessible Name)統一遮蔽封裝為標準的 `obj.name`, `obj.role`, `obj.value` 屬性供外掛呼叫。