首页 > 解决方案 > 使我的 gtk 应用程序可以在用 c 语言设计的不同平台上访问

问题描述

我需要学习如何在不同平台上访问用 c 语言设计的 gtk gui 应用程序的概念,尤其是在 microsoft windows 和 linux 中。为了清楚地理解这个概念,我在 c 中实现了一个非常简单的 gtk gui 应用程序,如下所示:

#include <gtk/gtk.h>

int main (int argc, char *argv [] )
{
GtkWidget *window;
GtkWidget *button;

gtk_init (&argc, &argv);

window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW (window), "Accessible program");
gtk_window_set_default_size (GTK_WINDOW (window), 200, 150);
gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_CENTER);



/* I am going to creat a button element and add it to display it on the toplevel window */
button = gtk_button_new_with_label ("OK");
gtk_widget_set_halign (button, GTK_ALIGN_START+20);
gtk_widget_set_valign (button, GTK_ALIGN_START+20);
/* also I am going to display a tooltip on this buttonr, when I drag a mouse pointer on it. */
gtk_widget_set_tooltip_text (button, "this is a small descriptive text related to this button element");

gtk_container_add (GTK_CONTAINER (window), button);

gtk_widget_show_all (window);

g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL);

gtk_main ();

return 0;
}

实现这个程序后,我在 linux (kali linux distro) 上编译如下: gcc main.c -o main.outpkg-config --cflags --libs gtk+-3.0

并按如下方式运行:./main.out

在运行 main.out 程序之前,我启用了 orca 屏幕阅读器来测试屏幕阅读器是否可以访问该程序。然后运行 ​​main.out 程序。运行这个程序后,我注意到,打开了一个新窗口,在屏幕上显示了一个带有工具提示的按钮元素。同时,我听说 orca 正在宣布,“可访问的程序框架。OK 按钮。这是与此按钮元素相关的小描述文本”。这意味着,在框架中创建了一个新窗口,其标题为“可访问的程序”。“确定按钮”表示,当前焦点在窗口的确定按钮元素上。“this is a small description text related to this button”的意思是,orca 宣布此消息是因为我在执行此程序时向此按钮添加了工具提示,由于现在主要关注这个按钮,因此 orca 宣布了这个工具提示。到目前为止,在 linux 环境中一切都很好。一瞬间!让我们稍微转移一下 microsoft windows 桌面环境。我在microsoft windows桌面环境10版中编译了这个源代码,使用gcc编译器如下:在windows命令提示符下,我执行了以下命令来编译源代码:echo gcc main.c -o main.exe > run。 bat pkg-config --cflags --libs gtk+-3.0 >> run.bat 然后,在命令提示符下:运行

我没有错误,我的程序编译成功。然后我只需在命令提示符下键入 main 并按 enter。注意:在我的 windows 10 环境中运行 main.exe 文件之前,我已经安装了 JAWS(带语音的作业访问)屏幕阅读器,它是 Windows 操作系统中最流行的屏幕阅读器。但是,我还使用 narrator 屏幕阅读器来测试我的程序使用屏幕阅读器的可访问性。其实问题就出在这个平台上运行main.exe程序之后。它运行成功,并打开一个新窗口。它显示窗口的所有元素。但没有屏幕阅读器,无论是 JAWS 还是旁白,都无法与此应用程序正确交互。在打开一个新窗口时,屏幕阅读器只宣布窗口的标题,在我的例子中是“可访问的程序”。但没有别的。屏幕阅读器既不会宣布按钮元素,也不会宣布按钮的工具提示。这就是问题。如果我将 orca 纳入考虑范围,那么这个 main.out 程序就可以了。为了更清楚地理解这个问题,我在命令提示符下运行了另一个名为 notepad.exe 的程序。要运行记事本,在命令提示符下,我键入不带引号的“记事本”,然后按 Enter。但它是如此惊人!打开记事本后,屏幕阅读器会宣布所有内容。一些问题萦绕在我的脑海:要运行记事本,在命令提示符下,我键入不带引号的“记事本”,然后按 Enter。但它是如此惊人!打开记事本后,屏幕阅读器会宣布所有内容。一些问题萦绕在我的脑海:要运行记事本,在命令提示符下,我键入不带引号的“记事本”,然后按 Enter。但它是如此惊人!打开记事本后,屏幕阅读器会宣布所有内容。一些问题萦绕在我的脑海:

  1. 为什么屏幕阅读器不能在 windows 平台上正确访问我的程序?
  2. linux 中的 orca 屏幕阅读器可以与我的程序正确交互。但在 Windows 中,JAWS 和 narrator 不是。为什么?
  3. Windows平台的屏幕阅读器可以访问其他程序,如ms word、记事本等。但它无法正确访问我的程序。我应该对我的程序做些什么,以使其在 Windows 平台上被屏幕阅读器正确访问?

带着这些问题,我在某个地方进行了调查,发现了 ATK 库和微软的主动可访问性 (MSAA)。我知道这些接口的用途。但它仍然让我感到困惑。此外,它在我的脑海中增加了一些新问题:

  1. 我没有在我的程序中使用 ATK 库。尽管如此,Linux 中的 orca 屏幕阅读器仍然可以正常访问我的程序。如何?
  2. windows平台下的同一个程序运行正常。但无法通过 JAWS 和 narrator 等屏幕阅读器访问。但是屏幕阅读器可以peoperly访问其他程序,如记事本ms word等。怎么样?当我想到第二个问题时,我想到了 MSAA(微软主动可访问性)。但我不知道如何在我的程序中使用 MSAA。所以我想到了第三个可能的问题:
  3. 我可以使用 ATK(可访问性工具包)和 gtk 在 Windows 平台上构建可访问的程序吗?

我希望有一个人可以帮助我。一旦我成为一名最好的程序员,我就会为开源社区做出很多贡献。

问候

标签: cgtk

解决方案


推荐阅读