2011-11-09 18 views
1

我的條形碼掃描器的作用就像是一串數字鍵盤。我希望它一直工作,所以我不使用文本輸入,而是連接到我的窗口的按鍵事件。不幸的是,當其他文本條目關注時,這也會發出。 AFAIK,因爲Windows首先接收事件,檢查快捷方式,然後傳遞它們。如果沒有小部件處理它們,是否有東西傳播回窗口?我該如何處理其他小部件不需要的鍵盤事件?

回答

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())來完成的。

正如你所說的,只是做的g_signal_connect()來的GtkWindow的按鍵事件信號會給你所有按鍵時爲焦點窗口發生。

嘗試做g_signal_connect_after()代替。這將有效地爲上述序列添加另一個回退 - 這意味着「在默認的處理器之後運行我的信號處理程序」。請注意,您將捕獲所有未處理的按鍵(例如,如果有人按下了應用程序無法處理的功能鍵),所以不要認爲通過您的處理程序的唯一內容來自您的條形碼掃描儀。

+0

請記住,所有其他的處理程序返回TRUE,以及幫助。 – user877329

0

嘗試配置您的條形碼掃描儀送說ALT位數(或類似),而不是數字的條形碼號碼,這將在這個過濾

+0

沒有掃描儀默認爲ALT,也沒有最終用戶知道如何配置掃描儀。依靠計時和校驗和來區分條形碼和其他輸入工作正常。 – Tobias