2010-12-27 10 views
3

タイトルとして、私はPython-gtkでMouseおよびKeyboardイベントをキャプチャしようとしています。デスクトップ上のキーボード/マウスイベント/ Linux上のpygtk(gtk.gdk)を持つルートウィンドウ

私はとのpython-のXlibでこれを簡単に行うことができます。

self.display = display.Display() 
    self.screen = self.display.screen() 
    self.root_window = self.screen.root 

    self.root_window.grab_pointer(1, 
      X.ButtonPressMask | X.ButtonReleaseMask | X.Button1MotionMask, 
      X.GrabModeAsync, 
      X.GrabModeAsync, 
      X.NONE, X.NONE, 
      X.CurrentTime) 

    self.root_window.grab_keyboard(1, 
       X.GrabModeAsync, 
       X.GrabModeAsync, 
       X.CurrentTime) 

私は機能* gtk.gdkを使用してアナログを参照してください、私はちょうどメインのデスクトップウィンドウ上のイベントをキャプチャするように見えることはできません。これはできますか?

これは私が仕事を達成しようとしていた方法です...(ALL_EVENTS_MASKは絶望の行為だった;])ここで

self.root_window = gtk.gdk.get_default_root_window() 
    self.root_window.set_events(gtk.gdk.ALL_EVENTS_MASK) 
    gtk.gdk.event_handler_set(self.filter_callback) 
    gtk.main() 

    def filter_callback (self, *args): 
     print args 

答えて

3

は、私はちょうどあなたがそれをベースにできることをやったという例です。

import gtk 


def on_key_press(widget, data=None): 
    print "click" 

if __name__ == '__main__': 
    w = gtk.Window() 

    # Connect the callback on_key_press to the signal key_press. 
    w.connect("key_press_event", on_key_press) 
    # Make the widget aware of the signal to catch. 
    w.set_events(gtk.gdk.KEY_PRESS_MASK) 

    w.show_all() 

    gtk.main() 

今起動スクリプトや任意のキーワードらほらキー(アウトプット)をクリック:

$ python gtk_script.py 
click 
click 
click 
click 

これが助けることを願っています

+0

これは既に含まれているサンプルコードの軽いバージョンです。また、gtkウィンドウです。 gtk.gdkウィンドウが必要です...この場合、単純なアプリケーションウィンドウではなく、全デスクトップ。私の問題はささいなことでしょう。 – digitalfoo

+0

@lsthree:ここで、set_events()を呼び出しますか?あなたのケースgtk.gdk.Windowにウィジェットを作成した直後に呼び出す必要があります。 – mouad

+0

ああ!おっと、私が以前見たことがあるとき、私はイベントメソッドの名前が同じだと思った。私は追加しましたが、問題はまだ残っています。たとえば、key_press、button_pressなどをデスクトップのルートウィンドウに接続することはできません。 'self.root_window.set_events(gtk.gdk.ALL_EVENTS_MASK)'は、別のウィンドウにフォーカスを当てるときや、ウィンドウを最小化/最大化するときのようなイベントを与えます。私はキーボードとマウスのイベントを取得する必要があります。 – digitalfoo

0

私はこれをプレーンGtkを使って行うことはできないと推測しています.Xlibや他の形式の通信をサーバー自体に関与させる必要があります。アプリがルートウィンドウ自体で実行されている場合を除きます。

私はもちろん間違っている可能性があります。

関連する問題