修改屏幕阅读器读取模式对话框的顺序

时间:2014-02-27 16:43:14

标签: windows winapi modal-dialog screen-readers

有没有人对屏幕阅读器和Windows对话框有任何了解?具体来说,如何强制屏幕阅读器按特定顺序读取对话框控件。 此顺序必须在运行时确定,因为实际的对话框控件是动态添加的,具体取决于要显示的对话框类型。

注意

我正在使用一个简单的Win32应用程序对话框。我能够重现我的问题的一个小例子是空白的Win32应用程序并使用默认的“关于”对话框。

背景

我需要更新现有的弹出对话框,以便对于那些需要屏幕阅读器的用户,它将被正确解释和理解。目前,屏幕阅读器以令人困惑的顺序阅读信息,使视障用户难以理解继续需要什么。

问题详情

我似乎无法更新对话框上控件的z顺序,以更改屏幕阅读器读取它们的顺序。

根据我的理解,我必须更新对话框上控件的tab-order(z-order),因为这是屏幕阅读器读取信息的顺序(如果这一点,请随时纠正我的意思我离这儿目标了。)

网络上的许多建议建议使用SetWindowPos函数或DeferWindowPos函数。不幸的是,我无法让这些工作正常。

我的“基本”测试对话框定义了以下控件;

HWND ctrl_StaticText1 = GetDlgItem(hDlg, IDC_STATIC_1);
HWND ctrl_StaticText2 = GetDlgItem(hDlg, IDC_STATIC_2);
HWND ctrl_StaticText3 = GetDlgItem(hDlg, IDC_STATIC_3);

HWND ctrl_Edit1 = GetDlgItem(hDlg, IDC_EDIT_1);
HWND ctrl_Edit2 = GetDlgItem(hDlg, IDC_EDIT_2);

HWND ctrl_Pict1 = GetDlgItem(hDlg, IDC_PICT_1);

HWND ctrl_ButtonOk = GetDlgItem(hDlg, IDOK);

然后我尝试按如下方式设置z顺序;

HDWP windowPos = BeginDeferWindowPos(7);

windowPos = DeferWindowPos(windowPos, ctrl_StaticText1, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE);
windowPos = DeferWindowPos(windowPos, ctrl_StaticText2, ctrl_StaticText1, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE);
windowPos = DeferWindowPos(windowPos, ctrl_StaticText3, ctrl_StaticText2, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE);

windowPos = DeferWindowPos(windowPos, ctrl_Edit1, ctrl_StaticText3, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE);
windowPos = DeferWindowPos(windowPos, ctrl_Edit2, ctrl_Edit1, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE);

windowPos = DeferWindowPos(windowPos, ctrl_Pict1, ctrl_Edit2, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE);

windowPos = DeferWindowPos(windowPos, ctrl_ButtonOk, ctrl_Pict1, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE);

EndDeferWindowPos(windowPos);

打开对话框时,屏幕阅读器显示“静态文本1,静态文本3,只读编辑”(只读编辑框为ctrl_Edit1,ctrl_Edit2不是只读)。

旁注

当对话框只包含几个静态文本控件时,此功能似乎正常工作,只有当我开始添加更多“复杂”控件时,例如编辑框和图片控件才会出现问题。

感谢您的帮助:)

修改

根据要求,下面是.rc文件(我假设它只是感兴趣的对话框控件部分。)

IDD_ABOUTBOX DIALOGEX 0, 0, 349, 190
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "About"
FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
    LTEXT           "Static text 1",IDC_STATIC_1,35,25,40,8,NOT WS_GROUP
    LTEXT           "Static text 2",IDC_STATIC_2,33,55,40,8,NOT WS_GROUP
    LTEXT           "Static text 3",IDC_STATIC_3,173,52,40,8,NOT WS_VISIBLE | NOT WS_GROUP
    DEFPUSHBUTTON   "OK",IDOK,292,169,50,14
    EDITTEXT        IDC_EDIT_1, 72, 95, 55, 14, ES_AUTOHSCROLL | ES_READONLY
    CONTROL         "",IDC_PICT_1,"Static",SS_BLACKFRAME,138,92,20,20
    EDITTEXT        IDC_EDIT_2, 174, 95, 40, 14, ES_AUTOHSCROLLs
END

注意,我在测试时做了一些更改,所以使用上面的文件,屏幕阅读器输出现在是“静态文本1,静态文本2,静态文本3,只读编辑”。

0 个答案:

没有答案