コンタクトリスト取得

コンタクトリストの中身はSkype.Friendsで取得する。UserCollectionなので、For each user in Skype.Friendsで登録しているユーザのリストが取れる。

    Dim user as SKYPE4COMLib.User
    dim handle as string 
    for each user in oSkype.Friends
        'コンタクトリストの中身
        handle = user.Handle
    next

user.HandleがSkypeIDとなる。発呼などは基本的にこのハンドルを扱う。user.FullNameは中身入ってないことがあるっぽい。プロフィールのところの名前がこれに該当する模様。user.DisplayNameはたぶん表示名が入ってるはずなんだけど、echo123の表示名はSkypeのUI上では日本語なんだけど、DisplayNameには英語が設定されるようだ。

初期化

まずSkype4ComからSkypeオブジェクトを取得して、SkypeにAttachする。アプリケーションの初期化とかと同じタイミングでいいかも。Skypeが起動していない場合はAttachに失敗する。Skypeの起動はClient.Start。Client.Startは結構時間かかるから、起動し終わるまで待ってあげたほうが本当はいいかも。

    '初期化
    oSkype = New SKYPE4COMLib.Skype
    If Not oSkype.Client.IsRunning Then oSkype.Client.Start()
    oSkype.Attach()

clgoo DL先 *Megahurtz
clgooは便利なんだけど、gooの仕様が変わったのでそのまんまじゃ使えない。ちょっとした改造で動くので、使えなくなっちゃった人は以下の情報を参考にpyファイルを編集してみたらいいんじゃないかな。

        # Original
        # part = data[data.find("<!--main_contents-->"):
        #             data.rfind("<!--Google AdSense-->")]
        part = data[data.find("<!--result-->"):
                     data.rfind("<!--Google AdSense-->")]
        # Original
        # total = part[part.find(u'結果&nbsp;<b>') + len(u'結果&nbsp;<b>'):
        #              part.find(u'</b>件')]
        total = part[part.find(u'検索結果[') + len(u'検索結果['):
                     part.find(u'件]')]
        # Original
        # headword_start = part.rfind('--headword--')
        # headword = part[part.find('<b>', headword_start):
        #                 part.find('</b>', headword_start)]
        # headword = headword.replace('<b>', '')
        # headword = headword.replace('<sup>', '')
        # headword = headword.replace('</sup>', '')
        #
        # body = part[part.find('<!--/headword-->'):
        #             part.find('<!--dictionary_name&exp_link-->')]
        headword_start = part.find('<!--/result-->')
        headword = part[part.find('<b>', headword_start):
                        part.find('<img', headword_start)]
        headword = headword.replace('<b>', '')
        headword = headword.replace('</b>', '')
        
        body = part[part.find('<div class="mainlst">'):
                    part.find('<!--dictionary_name&exp_link-->')]

Deecayさんがメンテナンスしてくれると一番いいんだけどなぁ。

lex_hook_on_initの仕様を変更。モードローカルのKeyMapをフック内でインストールできるようにした。フック用Fanctionの引数eventにkey定義を追加。デフォルトでサブモードを変更するキー定義が追加されている。関数が実体であることに注意。

event.keys = { (キーコード , 修飾キー) : 実行される関数 }

正直な話、キーを定義するだけならHookを使わなくても以下の書式でなんとかなると言えば、なんとかなる。サンプルはGoo翻訳(*Megahurtzさんのところの)

import clmode
mode = clmode.Top()

# Goo翻訳を使用
def ExecGoo():
    import clgoo
    clgoo.Goo()
mode.SetKeyDownHandler( ord('T'), MODKEY_CTRL, ExecGoo )

ついでに無印CraftLaunchにあった空欄コマンドの機能限定版のオプションを追加した。何も入力されていない状況、もしくはパラメータのみ入力した状況でEnterを入力すると設定されたコマンドを実行できる。無印ではShiftとかCtrlとかの修飾キーが押された場合も定義出来ていたようだけど、Exの場合は通常のEnterでないならSetKeyDownHandlerで定義すればいいと思うのでこれで充分ではないだろうか。