我如何只对其他小部件不想要的键盘事件采取行动?

时间:2011-11-09 12:45:02

标签: gtk

我的条形码扫描仪就像一个键盘喷射数字线。我希望它一直工作,所以我不使用文本输入,而是连接到我的窗口的按键事件。不幸的是,当其他文本条目具有焦点时也会发出这种情况。 AFAIK因为Windows首先接收事件,检查快捷方式,然后传递它们。如果没有窗口小部件处理它们,有什么东西会传播回窗口吗?

2 个答案:

答案 0 :(得分:2)

我将粘贴gtk_window_key_press_event()如何工作的摘要:

gboolean
gtk_window_propagate_key_event (GtkWindow        *window,
                                GdkEventKey      *event)
{
  gboolean handled = FALSE;

  focus = window->focus_widget;

  while (!handled)
    {
      GtkWidget *parent;

      handled = gtk_widget_event (focus, event);
      focus = gtk_widget_get_parent (focus);
    }

  return handled;
}

static gint
gtk_window_key_press_event (GtkWidget   *widget,
                GdkEventKey *event)
{
  GtkWindow *window = GTK_WINDOW (widget);
  gboolean handled = FALSE;

  /* handle mnemonics and accelerators */
  if (!handled)
    handled = gtk_window_activate_key (window, event);

  /* handle focus widget key events */
  if (!handled)
    handled = gtk_window_propagate_key_event (window, event);

  /* Chain up, invokes binding set */
  if (!handled)
    handled = GTK_WIDGET_CLASS (gtk_window_parent_class)->key_press_event (widget, event);

  return handled;
}

这基本上意味着:

  1. 查看密钥是否适用于助记符(即带有下划线的标签)或加速器(来自GtkAccelGroup)。

  2. 从焦点小部件开始,然后向上移动容器层次结构,查看某个小部件是否处理按键。

  3. 将按键传递给GtkWindow的父类。处理它的最接近的父是GtkWidget,它通过处理绑定(来自gtk_binding_entry_add())来实现。

  4. 正如你所说的那样,只需对GtkWindow的按键事件信号执行g_signal_connect()就会为你提供所有按键,当该窗口被聚焦时会发生。

    尝试改为使用g_signal_connect_after()。这将有效地为上面的序列添加另一个回退 - 它意味着“在默认值之后运行我的信号处理程序”。请注意,您将捕获所有未处理的按键(例如,如果有人按下您的应用程序无法处理的功能键),那么不要认为唯一可以通过您的处理程序进行操作的是来自条形码扫描仪。

答案 1 :(得分:0)

尝试将条形码扫描器配置为发送ALT数字(或类似数字)而非数字条形码的数字,这将有助于此过滤