■
MenuModeを更新。機能追加とバグを修正。clcmd_exも同封した。
MenuMode
結局config.pyの中でLoadCommandXMLを呼ぶことにした。LoadCommandXMLが2回呼ばれてしまうが、まぁいいか。重複コマンドは片方が削除されるし。
config.pyよりLoadCommandXMLが後に呼ばれているのは、コマンドを拡張した場合config.pyの中で先にimportしとかないといけないからのようだ。ということでコマンドの拡張はMenuModeの初期化よりも先に呼び出すようにして下さい。
あぁ、ReadMeをちゃんと書き直さないとなぁ、かなりいい加減になっている。
■
clcmd_exにバグがあったので更新。activate-or-shellexecでパラメータが渡っていなかった。
clcmd_ex
追記
clcmd_exに読み仮名のkanaを付けてるのに挑戦.コマンドも仮名で選択できるようになった,それに伴いMenuKeywordから日本語が検索可能に.しかしショートメニューのコマンドの仮名をclcmd_exからとってこようと思ったらconfig.pyがLoadCommandXMLより先に実行されているため,clcm.command_listを見ても空っぽ.仮名がとってこれない....clconfig.pyを書き換えるのもなんだしなぁ.config.pyの中でLoadCommandXMLを実行するか?それもいまいちな気が.
あとショートメニューのコマンドを日本語で使うと文字化けするバグが残ってた.コマンドは日本語登録してないので全然気が付かなかった.
■
MenuModeが大体出来たので公開してみる。
MenuMode
拡張子別に実行ファイルを選べたり、コマンドを階層メニューの中から選んだり出来るようになります。バグがあったら報告お願いします。改良して欲しい所も受付中。
MenuMode普及推進週間ということで,nakayatoさんとこで話題になっていたメニューからスタックされているモードを選ぶ方法をMenuMode使うとこんな感じ.
def SetMode(name): import clmode if clmode.Top().__class__.__name__ == 'MenuMode': PopMode() for n, mode in enumerate(clmode.mode_stack): if mode.__class__.__name__ == name: mode = clmode.mode_stack.pop(n) PushMode(mode) def SelectMode(): import os.path, clmode_menu, clmode list =[] omit_mode =['BaseMode'] #表示しないモード for mode in clmode.mode_stack: mode_name = mode.__class__.__name__ if omit_mode.count(mode_name)==0: list.append((mode_name, mode_name, u"SetMode('%s')" %mode_name)) args = {'SetMode':SetMode} menu = menu = clmenu.ParentMenu(item_list=[]) menu.AddMenuItem(list) PushMode(clmode_menu.MenuMode(menu, args=args)) SetKeyDownHandler( ord('M'), MODKEY_CTRL|MODKEY_ALT, SelectMode )
■
ハードウェアの取り外し
UnplugDriveというのを使ってハードウェアの取り外しをする.
シャットダウンや再起動する前にUSBメモリなどを取り外しておきたいのでシャットダウンする前にRemove()を呼び出して取り外して使っている.よく取りはずやつはコマンドに登録しておいても便利.
#UnplugDrive: http://homepage3.nifty.com/yamakox/Others/UnplugDrive.html def RemoveRemovableDisk(drvl): u""" Removable Diskを取り外す。取り外せたらTrue、不可能ならFalseを返す。 """ import win32com.client observer = win32com.client.Dispatch( 'UnplugDrive.Observer' ) if observer.IsUnpluggable( drvl ): observer.Unplug( drvl ) return True else: return False def RemovableDisk(): u""" Removable Driveのlistを返す. """ list=[] import win32file, win32api for drv in range(ord('c'), ord('z')): if win32file.GetDriveType(chr(drv)+':') == win32file.DRIVE_REMOVABLE: VolumeName = win32api.GetVolumeInformation(chr(drv)+':')[0] list.append((chr(drv),VolumeName)) return list def Remove(): u""" 取り外せそうなDriveを取り外す. """ import clapi, clconst for drv in RemovableDisk(): if clapi.MessageBox(drv[0] + u'ドライブに' + drv[1] + u'が装着されたままです。取り外しますか?',u'取り外し', clconst.MB_YESNOCANCEL) == clconst.IDYES: RemoveRemovableDisk(drv[0])
その他
MessengerModeでExecuteからInstantMessageを呼び出した後のフォーカスがおかしい.ExecuteのあとPopMode()でLancherModeExに戻して,非アクティブを呼んでも非アクティブにならない,なんでだろう.TasktrayModeも実行後のフォーカスがおかしなときがあるんだよなぁ.
MenuModeというのを製作中.コマンドを登録しすぎて忘れがちなのでメニューにまとめておいてそこから呼び出したりできたらなと思って作っている.あと拡張子別にコマンド候補を出したいとう話を良く聞くのでファイルをセットして呼び出したらそのファイルに応じたメニューが出せるようにもする予定.雛形は大体完成.
CraftLaunchExから選んだ画像ファイルの簡易ビューアとしてTkinterを使うってのを挑戦.thread(使ったことないけど)を使えばいけるに違いないと色々試してるけどうまくいかない.すぐに固まってしまう.
■
メッセンジャーモードはMessenger.UIAutomation.1のCOMオブジェクトを使ってMSN Messengerのオンラインメンバーやら、ファイルの送信やらをやるだけ。ソースは、
1年位前に作ってほったらかしにしたのを現在0.98用に直してる所。しかし、ひとつ問題が。それはMSN Messenger 7では、なにやらファイルを送るSendFileが使えない。困った。自力でキーを送信して実現するという荒業で乗り越えられなくはないんだが・・・