2012-03-06 12 views
0

linuxの画面全体からマウスイベントを検出することはできますか?私のアプリケーションはC言語でプログラムされ、gtk2を使用します。私はいくつかのプログラムのソースを見ようとしましたが、私が見つけたのは画面全体をつかんでいて、他のプログラムはもはやそれらのイベントを受け取っていませんでした。これは私が探しているものではありません。私は直接デバイスを読み取ることが、これは非常に良い方法ではないようですしようとしている瞬間にlinuxの画面全体からのマウスイベントの検出

..私は、キーボードによって行われた任意のマウスクリックイベントを取得したいと思い、スクリプトなど

+0

多分、ウィンドウマネージャのように動作するものをコーディングしたいのですか? http://tronche.com/gui/x/icccm/とhttp://www.freedesktop.org/wiki/Specifications/wm-spec ???なぜあなたはtpがすべてのマウスイベントを捕まえたいのですか? –

+0

私はユーザーの活動に基づいて何かをする必要があります(私は座標ではなくクリックイベントが必要です)。 – drwn

+0

このプログラムはかなり限定されたユーザベース(小さなオンラインゲームコミュニティ)に適しており、外部の人が何をしているのかを記述するのは難しいです。ウィンドウマネージャーはちょっと残念です。 – drwn

答えて

1

"解決策"いくつかの場所では、XSelectInputを使用してXウィンドウ全体のツリー内のすべてのウィンドウでButtonPressEventを選択し、SubstructureNotifyMaskを選択して新しいウィンドウについて調べます。このメソッドは、(ButtonPressEventを選択していないクライアントからのウィンドウからマウスイベントが伝播しないようにして)いくつかのプログラムを中断させることが知られています。また、別のクライアントがポインタ・グラブを持っていれば動作しません。

GrabModeSyncで永遠にポインタグラブを維持し、XAllowEvents(event_mode = ReplayPointer)を呼び出すことによってマウスイベントを通常取得するウィンドウに移動させることができます。完全なポインタを常に保持しておけば、ポインタをつかむことができると期待されるので、すべてのプログラムをひどく壊してしまいます。 XGrabButtonを使用してボタン+モディファイアの組み合わせを1つ取得することはできますが、実際にはウィンドウマネージャが干渉する可能性があります(ウィンドウマネージャを変更してイベントを通知するか、 。

あなたが使用しているすべてのプログラムがAT-SPIをサポートしていて、おそらくサポートしていない場合は、AT-SPIからのマウスイベントの通知を受け取ることができます。これは何も破ることはありませんが、一部のプログラムでは機能しません。

本当に良い解決策はありませんが、これらの壊れた解決策の1つは、必要な状況で、限られた方法で、または巨大な免責で適用されます。

+0

最初の方法は実際には機能しませんでした。なぜなら、同時に多くの他のプログラムを使用する必要がないからです。 – drwn

+0

しかし、すでにJavaに切り替えることを決定しました。これは小さなプロジェクトです。私たちは現在、プラットフォームに依存しません。また、多くのプラットフォームでうまく動作するように見えるjava用のマウスフックライブラリがあるため、http://code.google.com/p/jnativehook/ – drwn

1

具体的にマウスイベントについて知る必要がある場合は、ポインタを取得しない限り、実際にマウスイベントを行う方法はありません。

ユーザーがアイドル状態であるかどうかを検出したい場合は、Xスクリーンセーバー拡張機能を使用してその操作を行う方法があります。あなたは、ディスプレイを開いたときに拡張子を初期化する必要が

XScreenSaverInfo screen_saver_info = { 0, }; 

XScreenSaverQueryInfo(xdisplay, 
         xroot, 
         &screen_saver_info); 

if (screen_saver_info.idle > your_idle_threshold) 
     // screen is idle.  

注意、

int event_base, error_base; 
XScreenSaverQueryExtension(xdisplay, &event_base, &error_base) 

「男XScreenSaverQueryInfoは」持っているもう少し詳しく。

関連する問題