[ruby-list:41841] Re: ruby/tkでウィンドウにフォーカスがないときにもイベントを捕捉する方法

From: Hidetoshi NAGAI <nagai@...>
Date: 2006-02-21 14:47:29 UTC
List: ruby-list #41841
永井@知能.九工大です.

From: <kot-hara@secom.co.jp>
Subject: [ruby-list:41840] ruby/tkでウィンドウにフォーカスがないときにもイベントを捕捉する方法
Date: Tue, 21 Feb 2006 21:00:12 +0900
Message-ID: <EDFFF3AE7AC2FC4292A73EE62E2761B718022B0B@EXVS01.SECOM.corp>
> ruby/tkで例えば、tkのウィンドウにフォーカスがないときに、ディスプレ
> イの一番左上の隅でマウスを左ボタンクリックといったイベントを捕捉して、
> なにかを実行する、というようなものを作りたいのですが、どのようにすれば
> よいでしょうか。

Tk のウィンドウにフォーカスがあるかどうかは 
Tk.focus というメソッドで情報を得ることができます.
このメソッドは,現在フォーカスが存在するウィジェットオブジェクトを
返してくれます.
もし nil が返れば,フォーカスは Tk のウィンドウには存在しません.

問題は「ディスプレイの一番左上の隅でマウスを左ボタンクリックといった
イベントを捕捉」という部分ですね.
ここで言っている「ディスプレイ」がウィンドウマネージャが管理する画面の
ことであるならば,そこで発生したイベントを捉えるということは
ウィンドウマネージャからイベントを盗み取るということに等しいですから,
通常の手段ではできないのではないかと思います.
もし私が失念している機能がありましたらごめんなさい.

{TkRoot,TkToplevel}#overrideredirect(true) でウィンドウマネージャの
管理外にしたトップレベルのウィンドウを #geometry メソッドで
配置しておくというのが次善の策ではないかと思います.

# withdraw で一旦消して deiconify で表示し直すようにしないと
# overriderecirect の効果を正しく適用できないかもしれません.

何らかのライブラリ or ツールによって左上隅の背景画像を切り出し,
トップレベルのウィンドウの上にイメージ (ラベル) として貼り付けることで
あたかもそれが存在しないかのように見せかけることは可能です.
もちろん,デスクトップのアイコンと重なって配置してしまうと
アイコンが機能しなくなるなどが起きますので,注意は必要です.
-- 
                                       永井 秀利 (九工大 知能情報)
                                           nagai@ai.kyutech.ac.jp

In This Thread