2011-06-29 71 views
2

我在lablgtk2中遇到了很多test_modifier方法的问题。我可以测试Shift,但这对我的目的不是很有用。每当我测试控制和另一个键被按下时,什么都不会发生。我也试过这个:检查lablgtk2中是否按下了“control”

view#event#connect#key_press ~callback:(fun ev -> 
    let m = GdkEvent.Key.state ev in 
    let k = GdkEvent.Key.keyval ev in 
     if (m = [`CONTROL] && k = _F) then 
      ... 

它工作了一段时间,然后停止。上面的代码有什么问题,它不会做任何事情?如何正确测试lablgtk2中的Control键?

回答

3

一次可以有几个修饰符,因此与[`CONTROL]比较无效。

let pr fmt = Printf.ksprintf print_endline fmt 

let button label packing f = 
    let b = GButton.button ~label ~packing() in 
    let _ = b#connect#clicked ~callback:f in 
() 

let() = 
    let locale = GtkMain.Main.init() in 
    let window = GWindow.window ~title:"test" ~border_width:10() in 
    let _ = window#connect#destroy ~callback:GMain.quit in 
    let mainbox = GPack.vbox ~packing:window#add() in 
    button "quit" mainbox#pack window#destroy; 

    let _ = window#event#connect#key_press ~callback:begin fun ev -> 
    let m = GdkEvent.Key.state ev in 
    let k = GdkEvent.Key.keyval ev in 
    if (List.mem `CONTROL m && k = GdkKeysyms._F) then pr "WOO HOO"; 
    if (List.mem `CONTROL m && k = GdkKeysyms._f) then pr "woo hoo"; 
    false 
    end in 
    window#event#add [`KEY_PRESS]; 
    window#show(); 
    GMain.main() 
+0

非常感谢。我遇到了影响按键事件的其他修饰符(Num Lock,Caps等)的问题,因此只需对您的示例稍作修改即可满足我的需求,并且效果非常好。有一件事我注意到,这段代码并不能很好地工作,如果Caps Lock在组合键上,Ctrl + F不能按预期工作。 – metalnick