No タイトル ステータス 重要度 担当 完了予定日 更新日時 記事数
41 [Tips] 未着手 未定 未定 2009-05-20 08:40 8
AO's Script Gimmickの[Tips]を記載。
他にあれば投稿頂ければと。

1. 「タブロック以外全閉じ」の応用
「タブロック以外全閉じ」のスクリプトは、アクティブタブに「タブロック」が掛かっているか否かを次のように調べています。
 
    If luna.IsNavigateLock(luna.GetDocumentId(i)) = True Then
 
この IsNavigateLock を IsRead に変更すれば、「既読を閉じる」「未読を閉じる」というスクリプトを作成することができます。
他にも、アクティブタブから取得できる情報によって、「閉じる」条件を色んな形で変更できます。
「自動更新が掛かっているか」「タイトル・URLに特定の文字を含んでいるか」等。
2. vbs ファイルを使って hta ファイルを起動させる訳
「ボタン型検索」「ボタン型CSS切替」等のスクリプト本体はhtaファイルに記述されています。
それを、わざわざvbsファイルから起動させています。
これは、Lunascapeメニューのスクリプト選択ではhtaファイルが表示されない為です。
又、キーカスタマイズやマウスジェスチャーの登録でもhtaファイルは対象外になります。
下は、「ボタン型検索の」hta起動用のvbsファイルの内容です。
 

Dim luna,WSHShell,Fs,bs

Set luna = CreateObject("Lunascape.API")
Set WSHShell = WScript.CreateObject("WScript.Shell")
Set Fs = WScript.CreateObject("Scripting.FileSystemObject")

bs = chr(34) & luna.ScriptPath & "ボタン型検索2.hta" & chr(34)

WSHShell.Run bs

Set Fs = Nothing
Set WSHShell = Nothing
Set luna = Nothing
Wscript.Quit
 
ここでは、luna.ScriptPath を使ってLuna.exeが置かれているフォルダ直下のscriptフォルダを取得し、「&」でファイル名を結合させてhtaファイルのフルパスを求めています。
しかし、これではscriptフォルダ以外にファイルを置いたときの呼び出しが巧く行きません。
そこで、VBScriptに用意されているFileSystemObjectを使うことになります。
先ず、「Set Fs = WScript.CreateObject("Scripting.FileSystemObject")」でFileSystemObjectを使えるようにします。
そして以下のようにフルパスを求めます。
 
Fs.GetParentFolderName(WScript.ScriptFullName) & "\ボタン型検索2.hta"
 
 WScript.ScriptFullName スクリプト自体(vbsファイル)のフルパスを求めます。
 Fs.GetParentFolderName 上のフルパスからスクリプトが置かれている(親)フォルダを求めます。
 「&」と「\」を使ってファイル名を結合させてhtaファイルのフルパスを求めます。
 
こうすれば、vbsファイルとhtaファイルを「同じフォルダに置く」という条件付で、任意のフォルダに置くことができるようになります。
WSHShell.Run でhtaファイルを実行する際には、パスを「chr(34)」(ダブルコーテーション)で囲います。
この処理を行わないと、パス中のフォルダ名にスペースが使われている場合にエラーが出てしまいます。
 
3. どうやってスクリプトを起動させる?

スクリプトを起動させる時はどうやっていますか?
私が考え付く方法は以下の6つですが、皆さんはどうでしょう。

1. メニューのスクリプトから該当するものを選択する
2. マウスジェスチャ・キーカスタマイズに登録する
3. お気に入りに登録して選択する
4. リンクバーに登録する
5. 検索バーに登録する
6. 右クリックから呼び出す

これらの起動方法で「どれが一番良い」という事は無く、スクリプトの用途に合った使い分けをすれば良いと思っています。

私の使い方は以下のようです。

1. Lunascape のVer1.1では、スクリプトフォルダに設定されたフォルダ(デフォルトではscriptフォルダ)に置いてあるスクリプトしかマウスジェスチャ・キーカスタマイズの登録ができないようです。そこで、スクリプトフォルダの設定はデフォルトのまま、マウスジェスチャ・キーカスタマイズに登録するスクリプトを scriptフォルダに置き、あまり頻繁に使用しないスクリプトはサブ・フォルダに置いています。
2. 頻繁に使用するスクリプトを登録しておけば便利でしょう。私は余り使っていませんが、スクリプトをマウスジェスチャ・キーカスタマイズに登録にした時の動作確認をしています。
3. ローカルのフォルダを開くスクリプト(*)を登録しています。サーフィンモードを常に使用している場合などは、スクリプトをお気に入りにから選択した方が楽かもしれません。
4. 私は、リンクバーにリンクを登録せずに、スクリプトだけを登録して、「スクリプトバー」状態にしています。
5. 検索バーに入力された文字列を取得して動くスクリプト(例えば「複数語検索」等)を登録しています。
6. 設定の難易度や、使用しなくなった時の登録削除忘れの問題などもありますが、「余分なバーなどを表示させずに、画面を広く使いたい」という場合に便利かもしれません。私の場合は、マウスジェスチャー・キーカスタマイズの登録内容を忘れてしまうので、右クリックから選択ができるのは有り難いです。

 
(*)因みに 3. のローカルフォルダを開くスクリプトを下に示します。 
 

Option Explicit

Dim luna,WSHShell,folderName
Set luna = CreateObject("Lunascape.API")
Set WSHShell = WScript.CreateObject("WScript.Shell")

folderName = "c:\PROGRA~1\Lunascape"

luna.NewWindow folderName,true

WSHShell.Popup "詳細表示にします",1

rem WSHShell.AppActivate "- Lunascape"
WSHShell.Sendkeys "+{F10}"
WScript.Sleep 500
WSHShell.SendKeys "VD"

Set WSHShell = Nothing
Set luna = Nothing
 

  folderName で開きたいローカルフォルダのフルパスを指定します。但しロングファイルネームは使えないので注意してください。若し、短い形式のファイル名(フォルダ名)が分からない時は、DOSのプロンプトから dir を使って見るのが手っ取り早いでしょうか? 

自動的に詳細表示になるようにしていますが、不要であれば11行目から16行目までを削除すれば良いでしょう。

時間が有れば、初回起動時に フォルダ選択からパスを取得して、それをscript.iniに短い形式のファイル名の文字列として書き込んでおいて、次回から自動的に読み込んで開くようなスクリプトを作りたいと考えています。
 
4. スクリプトをデバッグする時
私はスクリプト用のデバッガを持っていないので、デバッグ作業は直接スクリプトを実行させることで行っています。
この時 Lunascape のメニューに有るスクリプトから実行させると、エラーがあった場合でも「Windows Script Host」のエラー表示が出ません。又、Lunascape のウィンドウが非アクティブになり、スクリプトのプロセスが残ったままになってしまいます。
そこで、デバッグ時には、メニュー以外から実行するようにしています。
皆さんがスクリプトをダウンロードして実行しても、エラー表示も無く巧く動作しない時、先ず Lunascape が非アクティブになっていないか確認してみてください。そして、メニュー以外(わざわざお気に入りに登録しなくても、「スクリプトの整理・編集」でウィンドウを表示させ、ファイルをダブルクリックする方法でOKです)から実行してみてください。若しエラー表示が出れば、それが問題解決に役立ちます。
5. 右クリックでスクリプト起動(暫定?)
右クリックから表示されるIEの「コンテキトメニュー」にスクリプトを登録して起動させたいと思うことが有ります。
例えば(実際にはLunascapeの標準機能で行えるので、この使い道はあくまで例としてですが)、表示されているページ内で単語を選択状態にし、選択部分で右クリックしてその単語をWeb検索する。
作業としては、スクリプトをHTMLファイルに記述し、レジストリにキーを書き加える事で可能です。
以下は、選択語をGoogle検索する為のスクリプトを書き込んだHTMLです。
 

<html>
<head>
<meta http-equiv="Content-Type"content="text/html; charset=Shift_JIS">
<title>選択語のGoogle検索</title>

<script language="VBScript" type="text/vbscript">
<!--
Dim luna,sdocument,seleRng,seleword
Set luna = CreateObject("Lunascape.API")
Set sdocument= external.menuArguments.document
Set seleRng = sdocument.selection.createRange()

seleword = seleRng.text

luna.NewWindow "http://www.google.com/search?" &_
"hl=ja&lr=lang_ja&ie=sjis&oe=sjis&q=" &_
seleword,true
-->
</script>

</head>
</html>
(Googleへ渡す文字列の指定方法は04/05/09現在確認済みのものです) 
 
レジストリへのキーの追加は、直接「regedit」から手動で行っても良いのですが、フリーソフトで右クリックに登録・削除が簡単に行えるものがありますので、そちらを使ったほうが良いと思います。ということで、追加方法はここでは割愛します。
又、上とは別の考え方として、既存のスクリプトを「呼び出す為だけ」のスクリプトをHTMLに書いて、右クリックに登録する方法もあります。
以下は、その例です。
 

<html>

<head>
<meta http-equiv="Content-Type"content="text/html; charset=Shift_JIS">
<title>右クリック(外部スクリプト呼び出し)</title>

<script language="VBScript" type="text/vbscript">
<!--
Dim WSHShell
Set WSHShell = CreateObject("Wscript.Shell")
WSHShell.Run chr(34) &_
"c:\Program Files\Lunascape\script\タブロック以外全閉.vbs" &_
chr(34)
-->
</script>

</head>
</html>
 
これは script フォルダにある「タブロック以外全閉.vbs」を呼び出していますが、ここのパスを書き換えれば、様々なスクリプトの登録が可能となります。
 
6. フレームは嫌い
表示されているページに対して動的(ダイナミック)に変更を加えるようなスクリプトを書く時、documentオブジェクトを取得しています。そのページがフレーム表示されている場合、個々のフレームについてdocumentオブジェクトを取得しないと、巧く処理できません(??)。
この個々のフレームについての巧い処理方法が思いつかないので、「フレームは嫌い」なだけです。
現状では、「document.Frames.length」として、フレームの数(ID?)を取得して処理しています。
が、フレームページの中に更に「IFRAME」等も使用している場合の処理をしていないので、そういったページでは巧く動きません。
一応、ここ(うらにわ)に「IFRAME」の処理を加えた「色変更ハイライト」のスクリプトを置いておきます。興味の有る方は覗いて見て下さい。但し、テスト版と言うことで、フレームの処理毎にコメントが表示されます。
他に、フレーム上でクリック等をして「選択されている」フレームのオブジェクトを取得する方法もあるようですが、(私個人の好みの問題ですが)選択するという行為で一手間増えるのと、一度に複数のフレームに対応できない事から、この方法は使っていません。
  • AO
  • 2009-05-20 08:40
7. 「現在開いているタブをIEで開く」

Lunascapeに標準で入っているスクリプトの「現在開いているタブをIEで開く」は
現状では、Tridentにしか対応していません。
アクティブタブがGecko、WebKitで開かれている場合は、GetDocumentObjectが
正常に動作しないので、URLの取得はAddressBarStringを使ってみましょう。
(追記 Lunascape.URLの使用も可。Lunascape5.0.4で確認)


以下書き換えたスクリプト。

//
// アクティブタブをIEで開く

var viewerPath = "C:\\Program Files\\Internet Explorer\\IEXPLORE.EXE"; //アプリケーションのパスを指定。

var luna = new ActiveXObject("Lunascape2.LunascapeAPI");
var ActiveTab = luna.ActiveIndex();

if(ActiveTab != -1)
{
//var doc = luna.GetDocumentObject(luna.GetDocumentID(ActiveTab));
var shell = WScript.CreateObject("WScript.Shell");
//shell.Run("\"" + viewerPath + "\" " + doc.URL, 1, false);

var tempURL = luna.AddressBarString;
shell.Run("\"" + viewerPath + "\" " + tempURL, 1, false);
}

luna = null;