K2さんの雑記
2002-12-06(Fri)■ [TTBase]atext(ALT+TABのタスクリスト一覧)naoさんちのatextプラグイン。TTBase用のALT+TAB置換用。もともとは、ここでも紹介したJoeをnaoさんが雑記で紹介したことに端を発する。Joeで、一覧を小さくしたいな、ウィンドウ出っぱなしがいいなと言ってたら、naoさんが作ると言うことになった。そういう小物を簡単に書けるようなぶっこみ常駐ソフトがあったらなとnaoさんがもらした。じゃぁ汎用的なのを書きましょということでTTBaseの初期アイデアができたのでした。 で、その発端となったatext。WindowsのALT+TABって突き詰めて調べると、かなりかしこいのであった。アプリケーションが設定ダイアログを出していた場合、その設定ダイアログにフォーカスがあたる。当たり前のように見えて、これが非常に難しい。そうだなぁ、EnumWindowsでアプリの一覧が欲しいという要望は、わたしの中ではWindows開発を始めた頃から何回もあって、そのたびにいろいろと逃げの手を打ってきたのだが、そろそろ突き詰めてもいいんじゃないかと、ちょっとがんばってみました。オープンソースの場合、誰でもそのソースが修正できるから、気が向いた人が気が向いたときに修正できるのでいいね。 もともと、EnumWindowsで得られたトップウィンドウ一覧から、どうやってゴミのウィンドウをふるい落とすかをいろいろ試行錯誤していたのだけども、どうしてもうまくいかない。一つのアプリで2つ以上のウィンドウが一覧されてみたり、それがいやでふるい落とす条件を厳しくすると表示されないものが出てきたり、いい落としどころがない。 その後、先ほど書いたことだが、モーダルダイアログなどがメインウィンドウの上に出ている場合は、そのモーダルダイアログにフォーカスを当てないといけないことが判明。フォーカスを当てようとするときに、もう一度EnumWindowsをやって、そのウィンドウの上にあるウィンドウを探そうとしたが、それもすべてのアプリについてはなかなかいい条件がわからなくて。 だいたい、Delphi製のアプリがまず例外の一番手。Delphi製のアプリには、見えないTApplicationというサイズ0のウィンドウがいることは結構有名な話なんだが、これとメインフォームとの区別がなかなか付かない。OSはどうやって区別しているか、いろいろ調べているがわからない。 Winampは、メインパネルがオーナーで、その下にプレイリストとかイコライザーとかがぶら下がっているが、親子関係はない。これも例外の一つ。 ウィンドウには、オーナーと親子関係という2つの関係が存在することをここで書いておくが、この辺が、タスクボタンが出るかとか、ALT+TABで表示されるかどうかとかに密接に絡んでくるのだ。 で、いろいろ調べて、だいたいわかった結論が以下。 タスクボタンに表示されるのは、EnumWindowsで得られるトップウィンドウのうち、オーナーと親ウィンドウがないウィンドウで、ウィンドウスタイルにWS_DISABLEDがなく、WS_VISIBLEであり、拡張ウィンドウスタイルにWS_EX_TOOLWINDOWがないもの。 ALT+TABで表示されるのは、上記のウィンドウをオーナーに持つウィンドウのうち、EnumWindowsで一番最初に列挙されるフォーカシング可能なウィンドウ。 ここには例外があって、オーナーと親を持たないウィンドウがWS_EX_TOOLWINDOWの場合、そのウィンドウがダイアログを所有すると、そのダイアログはALT+TABに表示される。 わかってみれば、そんなに複雑なロジックではない。で、ALT+TABのリストを得るためには、具体的にはどうするか。 まず、EnumWindowsで、親もオーナーも持たないウィンドウ(つまり最上位のオーナーウィンドウ)の一覧を取得する。その際、WS_EX_TOOLWINDOWを持つものはタスクボタンが出ないので、除去する。例外として、ダイアログを見つけたら、その最上位オーナーを捜して、それがWS_EX_TOOLWINDOWだったら、それは一覧に追加しておく。 次に、その最上位オーナー一覧を保存しておいて、もう一度EnumWindowsを行う。その際、WS_DISABLEDでなくWS_VISIBLEであり、WS_EX_TOOLWINDOWでないウィンドウを見つけたら、その最上位オーナーを捜し、最上位オーナー一覧のオーナーウィンドウをそのウィンドウで置き換える。一度置き換えたら、一番最初のウィンドウを優先するため、そのウィンドウは固定する(もう入れ替えない)。ただし、最上位オーナーウィンドウがフォーカスを得られる場合(つまりWS_DISABLEじゃなくWS_VISIBLEな場合)、そのウィンドウを優先する。 最後に、2回目のEnumWindowsで置き換えられなかったウィンドウは、フォーカシング可能なウィンドウがないということだから、オーナーウィンドウ一覧から除去する。(最上位オーナーウィンドウが条件にマッチして結果的に置き換えられなかったものは除去しない) これで、ALT+TABの一覧を得ることができる。ただし、これでもDelphiのTApplicationウィンドウを避けることができないので、2回目のEnumWindowsで、サイズが0のウィンドウははじくようにする。OSがサイズ0のウィンドウを特別扱いしているとはわたしには思えないので、この部分のロジックがわたしの中では未解決。 というわけで、これでだいたい完全なALT+TABリストを得ることができました。ちょい疲れたけど、なかなかいい勉強でした。 [追記] 文章をまとめていて気づいたが、TApplicationは、もしかしてEnumWindowsで列挙されるウィンドウ順で、必ずメインウィンドウより後ろに列挙されるのではないか。そうだとしたら、上記のロジックでウィンドウ一覧を集める場合、サイズ0のウィンドウをはねる必要がなくなるな。確かにSpy++などで見ていると、TApplicationは、たいていメインウィンドウのいくつか後ろにいる。 なるほどそういうことか。最後の謎も氷解。ALT+TABを見切らせていただきました。 [追記2] だめだ。追記は間違い。最上位オーナーは優先するから、TApplicationの列挙順序が後ろでも優先されちゃうんだよなぁ。やっぱ、ここは謎のまま。 [ツッコミを入れる]
2003-12-06(Sat)■ POPFile迷惑メール対策第2弾。今日はPOPFileのインストールを行った。 はじめ、ローカルマシンにWindows用インストールプログラムを使用して導入したが、これは簡単にできた。でも、うちにはクライアントマシンが2台あり、メールフォルダはサーバー上に置いてあるし、クライアントマシン2台からメールチェックを行う。よって、Linuxのサーバーに入れたくなるじゃない、やっぱり。 で、そこから格闘が始まった。参考にしたのはこの辺とか。 CrossPlatform版をダウンロードして、Linux上で解凍(/usr/local下に入れた)し、とりあえず起動してみたが、まずBase64モジュールが無いと言われた。VinePlusからrpmを持ってきてインストール、これはOK。次にBerkeleyDB.pmが無いと言われる。どうやら、BerkeleyDBが必要なようだ。 BerkeleyDBをセットアップする。ダウンロードは、Sleepycat Softwareから。インストールは、以下のようにして行った。 % cd 解凍したフォルダ % cd build_unix % ../dist/configure % make # make install perlモジュールは、CPANから持ってくる。 perl -MCPAN -e shell で、cpanシェルを起動し、 install BerkeleyDB で、インストールが開始するが、最後まできちんと終了しない。参考にしているページにもこの辺のことが書いてあるが、手順を引用しておく。
これで、BerkeleyDB.pmがインストールされる。 ここまで来て、Encodeモジュールが無いとだめだよというのをWeb記述で見つける。Encodeモジュールはperlの5.8系じゃないと使えないようだ。POPFileソース自体を書き換えるという方法もあるのだが、なるべくオリジナルソースをさわりたくないので、perlを5.8.2にアップデートすることにした... が、Linuxってよくわかってないから、全然自信ない。なんとかコンパイルしてインストールまで持って行った。(よくインストールできたもんだ...) まず、perlのソースをwww.perl.comからダウンロード。それを適当なフォルダに解凍し、以下のようにした。 % cd perl-5.8.2 % ./Configure ここで、いろいろ聞かれるのだが、コンパイラ(CC)をGCCに変えただけで、後は全部デフォルトでENTERキーをたたき続ける。(すごく不安) % make % make test これで、コンパイルとテストが行われるが、時間がいっぱいかかる。 % su # make install これで終了。その後、/usr/binのperlが更新されていないので、これを/usr/local/binのもので上書き。一応動くようになったみたい。本当にこれでいいのかどうかは全然自信ないので、まねはしない方がいいと思う。別のところで調べてね。 その後、BerkeleyDB.pmをインストールし直し、やっとpopfile.plを起動するところまで来た。が、Port110がだぶっていて使えないというメッセージが出てだめ。 さっきのこのページの前の日の日記では、popfile.cfgを書き換えてポート番号を変更すればよいと書かれているが、そもそも一度も起動できないと、popfile.cfgは作成されないようだ。仕方がないので、grepで110と8080を探し、ソースを直接10110と18080に変更。やっと起動することができた。 インストールしたのはサーバーマシンであり、使用するのはクライアントから。http://[ServerIP]:18080/でアクセスできるはずなのだが、アクセスできない。おかしいなぁと、ローカルにインストールしたPOPFileを調べていると、設定に外部クライアントから接続できるかどうかという項目があることを発見。先ほども出てきたpopfile.cfgがこの時点ではできていたので、その中の該当する2項目を書き換え(書き換える前にPOPFileは終了させておくこと)、再起動すると、成功! この後、メールクライアントからの受信も成功。やっと動き出したところなので、まだ振り分け機能は赤ん坊状態で、これから鍛えなければならない。SPAMは数限りなく来るから、簡単に学習させることはできるだろう。 今のところROOT権限で動作させている。ところで、Linuxって、起動時にプログラムを動作させるにはどうすればよいのかな。cronを使えば一定時間ごとの起動はできるのは知っている。が、起動時に一度だけ起動すればよいものは、どういう風に設定しておけばよいのかな。 本日のツッコミ(全3件) [ツッコミを入れる]
2004-12-06(Mon)■ あー、そういえば永さんからメーリングリストにエラー報告が入っていた。K2Editorの。最近、めちゃくちゃ忙しくて、なかなかソースコードを見ることもできないので、もうちょっと待ってください。 [ツッコミを入れる]
1965|09|
|
//
自己紹介
自己紹介
広告
計るだけダイエット
つっこみリスト
TrackBacks
日記仲間
な/
す/
ひ/
最近の日記
|
◆ nao [起動時スクリプト書くなら /etc/rc.local でええんじゃないですかね。]
◆ nao [ln -s /usr/loca/bin/perl /usr/bin/perl の方が良かったかな(^^; 次perl..]
◆ K2 [情報ありがとうございます。 perlの方ですが、そうですね、リンク張っちゃった方がいいんでしょうね。やり方調べるの面..]