Tips - CraftLaunch

スタートメニューの中のショートカットを自動的にコマンドとして登録するには

config.py に以下のように記述することによって、スタートメニューの中のショートカットを自動的にコマンドとして登録することができます。

ただし、スタートメニューの内容が変化した後、それを反映させるには、CraftLaunchのなかで、[Reload]する必要があります。

    # --------------------------------------------------------------------
    # スタートメニューの中のショートカットをコマンドとして登録する
    if 1:
        startmenu_items = []
        MAX_PATH = 260
        CSIDL_PROGRAMS = 2
        CSIDL_COMMON_PROGRAMS = 23
        buf = ctypes.create_unicode_buffer(MAX_PATH)
        ctypes.windll.shell32.SHGetSpecialFolderPathW( None, buf, CSIDL_PROGRAMS, 0 )
        programs_dir = buf.value
        ctypes.windll.shell32.SHGetSpecialFolderPathW( None, buf, CSIDL_COMMON_PROGRAMS, 0 )
        common_programs_dir = buf.value
       
        startmenu_dirs = [
            programs_dir,
            common_programs_dir
        ]
       
        for startmenu_dir in startmenu_dirs:
            for location, dirs, files in os.walk( startmenu_dir ):
                for filename in files:
                    if not filename.lower().endswith(".lnk"):
                        continue
                    name, ext = os.path.splitext(filename)   
                    item = ( name, window.command_ShellExecute( None, os.path.join(location,filename), u"", u"" ) )
                    startmenu_items.append(item)
                   
        startmenu_items.sort()
       
        window.launcher.command_list += startmenu_items
   

独自のコマンドラインルールを追加するには

CraftLaunchでは、window.commandline_list に独自のオブジェクトを追加することで、コマンドラインの解釈/実行方法をカスタマイズすることが出来ます。

この例では、URLが特定の場所のときだけ、デフォルトのブラウザの変わりに、IEを使って開く処理を追加しています。

    import urlparse
    class commandline_MyExecuteURL:
        def __init__(self):
            pass
        def onCandidate( self, update_info ):
            return []
   
        def onEnter( self, commandline, text, mod ):
   
            if not (text.lower().startswith("http:") or text.lower().startswith("https:")):
                return False
           
            parsed_url = urlparse.urlparse(text)
           
            ie_list = [
                "yahoo.co.jp",
                "biglobe.ne.jp",
            ]
           
            browser = None
            for ie_loc in ie_list:
                if parsed_url.netloc.lower().endswith(ie_loc):
                    browser = "C:\Program Files\Internet Explorer\iexplore.exe"
       
            def jobShellExecute( job_item ):
                if browser:
                    shellExecute( None, None, browser, text, u"" )
                else:
                    shellExecute( None, None, text, u"", u"" )
            def jobShellExecuteFinished( job_item ):
                pass
            job_item = JobItem( jobShellExecute, jobShellExecuteFinished )
            JobQueue.defaultQueue().enqueue(job_item)
            commandline.appendHistory( text )
       
            commandline.quit()
            return True
        def onStatusString( self, text ):
            return None
    window.commandline_list = [ commandline_MyExecuteURL() ] + window.commandline_list


ディレクトリ名を入力してファイラで開くには

CraftLaunchでは、window.commandline_list に独自のオブジェクトを追加することで、コマンドラインの解釈/実行方法をカスタマイズすることが出来ます。

下の例では、以下のような処理を行っています。

  1. 入力された文字列を、区切り文字 ; で分解して、最初の引数がディレクトリ名かどうかチェック。 ディレクトリではなかったら、Falseを返す。(次の評価へ)
  2. ディレクトリ名なら、ファイラで開く。
  3. コマンド履歴に追加
    class commandline_OpenByFiler:
        def __init__(self):
            pass
        def onCandidate( self, update_info ):
            return []
   
        def onEnter( self, commandline, text, mod ):
   
            args = text.split(';')
            dirname = args[0].replace('/','\\').rstrip('\\')
            if not os.path.exists(dirname) or not os.path.isdir(dirname):
                return False
       
            def jobOpenByFiler( job_item ):
                filer = r"c:\ols\cfiler\cfiler.exe"
                arg = '-L"%s" -R"%s"' % (dirname, dirname)
                directory = "c:\ols\cfiler"
                #print [ filer, arg, directory ]
                clnch_misc.shellExecute( None, None, filer, arg, directory )
            def jobOpenByFilerFinished( job_item ):
                pass
            job_item = JobItem( jobOpenByFiler, jobOpenByFilerFinished )
            JobQueue.defaultQueue().enqueue(job_item)
            commandline.appendHistory( text )
       
            commandline.quit()
            return True
        def onStatusString( self, text ):
            return None
    window.commandline_list.insert( 0, commandline_OpenByFiler() );