#http://www.ac-promenade.net/text/windowsmobile/ #Scripted by AC-Promenade http://www.ac-promenade.net/ #TCPMP・サポート #TCPMP_Sp.mscr #定番の音楽動画プレーヤー、TCPMPを色々と補助するMortScript。 #音楽視聴中に、イヤホンマイク側の通話ボタンを利用して、 #電話機本体を取り出す事無く、再生/停止の操作を行ったり、 #聴いていて気に入った曲をお気に入りに登録したり、 #時刻を音声で確認したりできるのが、主な特徴です。 #発着信時に自動で停止、通話後自動で再開する機能もあります。 #またxclkcfg_03のクロックダウンによる低電力再生もできます。 #●使用方法概要 #いくつかの動作は本文中の環境設定により変更できます。 #・本mscrの設定を確認し、使用の準備を整えます。(詳細は後述) #・本mscrを実行すると、TCPMPを起動します。 #・TCPMP起動中に本mscrを再実行すると画面消灯し電池節約します。 #・上記画面消灯時、xclkcfg_03が有効ならクロックダウンします。 #・お気に入り記録機能が有効の場合、ファイル確認を行います。 #・その後、TCPMPの縦横ボタン位置と色をスキャンして、記憶します。 #・一度スキャンに成功すれば、以後スキャンしない設定ができます。 #・起動時、必要なら入力を"数字"に変更できます。(数字メニュー用) #・電話発着信時にTCPMP自動停止、終話後に再生する設定ができます。 #・キーロック時、設定が有効なら画面の消灯を行います。 #・キーロック時、xclkcfg_03が有効ならクロックダウンします。 #●キーロック時にイヤホンマイクの通話ボタンで行う操作方法。 #・以下特に設定をしていなければ、通常の再生停止操作ができます。 #・GCLOCKf(音声時計)が有効なら、音声で時刻を読上げます。 #・時刻読上げ中に再び通話ボタンを押すと、TCPMPを一時停止します。 #・一時停止中も通話ボタンを押せば、再び時刻が確認できます。 #・同じくその間にもう一度通話ボタンを押すと、TCPMPを再生します。 #・お気に入り曲機能が有効なら、受付確認音チャイムが鳴ります。 #・確認音の間に再び通話ボタンを押すと、再生中の曲を登録します。 #・GCLOCKfを使用しない場合、確認音のまま放置すれば再停操作です。 #●使用の準備 #別途、拙作の"Trigger_KeyLock.mscr"と"Trigger_ShPhone.mscr"の #二つを導入すれば、特に設定する事無く、また普段は常駐せずに #キーロックオン、電話発信、着信、各それぞれの必要状況を検知して #自動起動し、処理を行うようになります。 #この方法が最も安定して動作すると思います。 #Trigger_KeyLock側でデフォルト対応パス設定を合わせて下さい。 #"cmdRegistryNotifyApp"の直接利用は、その他別のmscrが #キーロックを利用して起動するケースが多いので推奨しません。※ #常駐利用の際は、本文設定Always=1にして本mscrを起動して下さい。 #代行起動の上の併用設計なので、スタートアップ登録は不要です。 #TCPMPの終了を発見次第、本mscrも同時に終了します。 #(常駐利用時は、本mscrの再実行による画面消灯ができません。) #自前で動作環境を構築する場合は、Always=0にして、 #[HKEY_CURRENT_USER\Software\Sharp\PhoneStatus] #"Status0"=dword:00000001(10進)(キーロックオン) #また、[HKEY_CURRENT_USER\Software\Sharp\PhoneApp] #"LockPhone"=dword:00004097(10進)(電話着信)、 #及び、dword:00131073(10進)(電話発信) #それぞれを、トリガーにして本mscrを起動するようにして下さい。 #("MortScript" "cmdRegistryNotifyApp" "RegCondExec" 等) #またはキーロック時に本mscrを実行できる環境を用意して下さい。 #"KLChgExec"が有用だと思います。 #合わせて通話時に本mscrを実行できる環境を用意して下さい。 #WS007SHなら"DenwaPlus"というソフトがあります。 #●動作確認デバイス #Advanced/W-ZERO3[es], WILLCOM 03 #RealVGA化に多分対応してると思います、ミディアムは謎です。 #他ZERO3系デバイスでも、動くかもしれません。 #電話やキーロックの処理上、その他機種は動かないと思います。 #もし他のWindows Mobile機でも動いたらご報告頂けると嬉しいです。 #●必要環境 #・MortScript4.1以上(それ以下でも動くかも)、mscrの関連付け。 # http://www.sto-helit.de/ (PCサイト) #・TCPMP (定番の音楽、動画再生ソフト) # http://blogs.shintak.info/articles/TCPMP.aspx #●補足事項 #・Trigger_KeyLock (キーロックで指定アプリ群起動) # http://www.ac-promenade.net/text/windowsmobile/index.html#Trigger_KeyLock #・Trigger_ShPhone (電話状態で指定アプリ群起動) # http://www.ac-promenade.net/text/windowsmobile/index.html#Trigger_ShPhone #・GCLOCKf (音声時計 フリー版 ARM web.archive.orgより) # http://web.archive.org/web/20030609190939/http://homepage1.nifty.com/hidori/download/windowsce/index.html #・xclkcfg_03 (アドエスやWILLCOM 03はup0392.zipを使用して下さい。)※ # http://w-zero3.org/?%A5%AA%A1%BC%A5%D0%A1%BC%A5%AF%A5%ED%A5%C3%A5%AF#v9ef6f13 #※なお、今のところCPUプロセス動作上、ビームは常にオフであると想定しています。 #・cmdRegistryNotifyApp (非常駐でレジストリを監視) # http://ssipa.web.fc2.com/ #・RegCondExec (常駐してレジストリを監視) # http://www20.atwiki.jp/zero3_392/pages/10.html #・KLChgExec (キーロック時に任意のプログラムを実行) # http://w03holic.seesaa.net/article/64774968.html #・DenwaPlus (常駐して通話を監視、WS007SHのみ) # http://dislife.com/software/ #・ExecMulti (複数アプリの起動代行管理) # http://www.momo-lab.net/inu/execmulti.html #本mscrのショートカットに、アイコンを利用したい場合は、 #ショートカットファイルのリンク先に、直接続けて #?\Program Files\TCPMP\player.exe,-1000と追記して下さい。 #(インストールパスが異なる場合は、記述を修正して下さい。) #※他に、これと同一タイミングで起動するmscrを利用している場合、 #MortScript.exe本体が行う複数タスク管理中に実行されたmscrが、 #処理を無視される場合があります。 #これを回避するには、"MortScript"や"ExecMulti"等を利用して #各mscrの起動タイミングを、ほんの少しずらす様にして下さい。 #W-ZERO3系デバイスでは、キーロックの通知メッセージによって #MortScript側の処理が一時停止するという弊害があります。 #これをサイレント化する手段として、本mscrは #[HKEY_CURRENT_USER\Software\Sharp\PhoneStatus\DispLockIcon] #が2であれば恒久的に1以下(ロックの初回メッセージのみ停止)、また #[HKLM\HARDWARE\DEVICEMAP\KEYBD\KeyLocked]を一時的に0にします。 #本体動作に影響はありませんが、別アプリがこの値を参照する場合 #誤作動をする可能性がありますので、その点にご注意ください。 #アンインストールの際は、本mscrを削除するだけで大丈夫です。 #お気に入り設定を行っている場合、プレイリストも削除して下さい。 #レジストリの追加は行っていません。 #本mscrによって生じる不利益に当方は関与しません。 #設定変数値を除く内容に改ざんがない限り、再配布は自由です。 #内容に変更を加えた際の再配布は、必ずその変更前と変更後の #明記を、本文中にて行ってあれば構いません。 #--------------------------------------------------------------- #以下環境設定 #(書き換えの際、文字コードS-JISが変換されないよう御注意下さい。) #■TCPMPがインストールされているパスを指定。 TCPMPPath="\Program Files\TCPMP\player.exe" #■本mscr実行時、入力モードを"数字"(_1)にする=1、しない=0。 #TCPMPのメニューを数字対応させていなければ不要です。 #また、入力モードを変えない限りOS側が覚えておいてくれてるので、 #絶対的に数字モードにしておきたいという場合のみ使用して下さい。 InputNumber=0 #■スクリプトを常駐(単体)モードで使用するなら=1、でなければ=0。 Always=0 #■TCPMP起動中に本mscrを再実行したら画面消灯する=1、しない=0。 #(常駐モードで使用している場合、この機能は使えません。) DispOff=1 #■電話発着信時、自動的にTCPMP再生を一時停止する=1、しない=0。 #(電話終了後も、自動的に再生を開始します。) AutoStop=1 #■TCPMP停止中にサスペンドすると通話ボタンに反応しなくなるので #サスペンド抑止時間を整数(分)で指定。(経過後は本体設定に依存。) DontSusMin=40 #■TCPMP利用時は、キーロックで画面消灯する=1、しない=0。 #再び点灯した際は定期的に(約30秒に一回)オフにします。 KLDispOff=1 #■WILLCOM 03は電話が起動するとイルミキーが点灯してしまうので、 #電池消耗対策に静的な再消灯処理も行うなら=1、でなければ=0。 #(アドエスの場合=0で大丈夫です。) IllumiReOff=1 #■再生停止操作音wavファイルパス。使わない場合""内空欄に。 #音サンプル:"\Windows\ShutterSound.wav" ToggleSound="\Windows\ShutterSound.wav" #■xclkcfg_03を利用してクロック操作を行う為のパスと引数を指定。 #引数は"-d"デフォルト "-f"前回設定 "-f0"〜各パラメータ順です。 #バッテリー節約の為にクロックダウンを行うのが基本目的です。 #xclkcfg_03によるクロック変更は再生中断と同時に解除します。 #パス指定先にファイルが存在しなければこの機能は無視されます。 #(故意に利用しないのであれば""内を空欄にでもして下さい。) xclkcfgCmd="" xclkcfgArg="-f2" #■音声時計GCLOCKfを利用する為のパスを指定。 #パス指定先にファイルが存在しなければこの機能は無視されます。 #(故意に利用しないのであれば""内を空欄にでもして下さい。) GCLOCKf="\Program Files\GCLOCKf\GCLOCKf.exe" #■お気に入り曲記録機能を使うなら、ファイル(m3u等)パスを指定。 #指定パス先にファイルが存在しなければ、自動生成します。 #なのでこの機能を利用しない場合""内を必ず空欄にして下さい。 #パス指定の例:"\My Documents\マイ ミュージック\TCPMP_Sp_Favorite.m3u" Favm3uPath="" #■お気に入り受付音wavファイルパス。使わない場合""内空欄に。 #音サンプル:"\Windows\Alarm3.wav" FavChkSound="\Windows\Alarm3.wav" #■お気に入り実行音wavファイルパス。使わない場合""内空欄に。 #音サンプル:"Voicbeep.wav" FavEntSound="Voicbeep.wav" #■スキャン成功音wavファイルパス。使わない場合""内空欄に。 #音サンプル:"\Windows\Default.wav" ScanSound="\Windows\Default.wav" #■スキャンロックを有効にする=1、ロックしない=0。 #LastDataが正常値なら、ロックすることで処理を簡略化できます。 #テーマによってインターフェースカラーが変更したり、 #ボタンレイアウトに変更があったら解除して再スキャンして下さい。 ScanLock=0 #--------------------------------------------------------------- #バージョン履歴 #1.21 xclkcfg_03機能を非ロック画面消灯時にも適用。 #1.20 xclkcfg_03機能を追加、低クロック再生で電池を節約。 #1.11 GCLOCKf機能以外が有効だと再停操作できなかった仕様を修正。 #1.10 お気に入り曲記録機能追加、それに伴う伴わずコード修正。 #1.02 TCPMP起動中の、本mscrによる画面消灯が機能しないバグ修正。 #1.01 既にTCPMPがある時、本mscr実行でTCPMをアクティブに。 #1.00 公開。 #--------------------------------------------------------------- #Main Script #■PPC制限 If(MortScriptType() ne "PPC") message("This script is PPC only.") Exit EndIf #■キーロックメッセージオフ RegWriteDWord ("HKLM","HARDWARE\DEVICEMAP\KEYBD","KeyLocked",0) If (RegRead ("HKCU","Software\Sharp\PhoneStatus","DispLockIcon")>=2) RegWriteDWord ("HKCU","Software\Sharp\PhoneStatus","DispLockIcon",1) EndIf RegKeyLock="RegRead (""HKCU"",""Software\Sharp\PhoneStatus"",""Status0"")" RegInput="RegRead (""HKCU"",""Software\Sharp\PhoneStatus"",""Status22"")" RegLockPhone="RegRead (""HKCU"",""Software\Sharp\PhoneApp"",""LockPhone"")" RegWrapper="RegRead (""HKCU"",""Software\Sharp\ShPhoneLib"",""WrapperActiveComm"")" RegLastPlayNum="RegRead (""HKLM"",""Software\TCPMP\PLAY"",""47"")" RegLastPlayTitle="RegRead (""HKLM"",""Software\TCPMP\PLAY"",Eval (RegLastPlayNum)+4096)" #LastDataSt TCPMP_X=193 TCPMP_Y_L=453 TCPMP_Y_P=773 BaseColor=13556719 #LastDataEd Call ("StatusChk") #■起動代行や画面処理、処理準備開始 If ( (ValKeyLock=0) and (ValWrapper=0) and (ValLockPhone<4097) ) #■お気に入りファイル検知セクション If ( (Favm3uPath ne "") and Not FileExists (Favm3uPath) ) If ( (Find (Favm3uPath,"\")<>1) or Find (Favm3uPath,"\\")\ or (ReverseFind (Favm3uPath,"\")=Length(Favm3uPath)) ) message ("以下のパス指定は無効です。^NL^設定を確認して下さい。^NL^Favm3uPath="""&Favm3uPath&"""^NL^TCPMP_Sp.mscrを終了します。") Exit ElseIf (Question ("以下ファイルを作成します^NL^"&Favm3uPath,"OkCancel")<>OK) Split (Favm3uPath,"\",0,PathPart) i=2 PathAll="" While (i0) or (ValLockPhone>=4097)) ) ) ToggleCheck=0 #■電話待機、空電話 If ( (ValProcTCPMP=1) and (ValKeyLock=1) ) If (FileExists (GCLOCKf)) GCLOCKfUse=1 Else GCLOCKfUse=0 EndIf If (FileExists (Favm3uPath)) FavChkUse=1 Else FavChkUse=0 EndIf Minimize ("電話 ") Sleep (300) SusCount=DontSusMin * 2 Call ("DispReOn") While ( (Not WndActive ( "電話 ")) and (ValProcTCPMP=1) and (ValKeyLock=1) ) If ( (IllumiReOff=1) or (KLDispOff=1) ) ToggleDisplay (False) EndIf Call ("ScrAngleChk") If (ColorAt (TCPMP_X, TCPMP_Y) = BaseColor) If (SusCount > 0) IdleTimerReset SusCount=SusCount - 1 EndIf Else SusCount=DontSusMin * 2 If (FileExists (xclkcfgCmd)) Run (xclkcfgCmd,xclkcfgArg) EndIf EndIf ErrorLevel ("syntax") WaitForActive ("電話 ",30) ErrorLevel ("error") Call ("StatusChk") EndWhile EndIf #Sleep (100) #■電話発着信待機 If ( (ValProcTCPMP=1) and ((ValWrapper>0) or (ValLockPhone>=4097)) ) Sleep (500) If (AutoStop=1) Call ("ToggleToStop") Sleep (1000) Minimize ("TCPMP") EndIf Call ("CallWait") Call ("StatusChk") EndIf #■電話起動の対応 If (ValProcTCPMP=1) If (CallCheck=1) CallCheck=0 Call ("ToggleChkRev") ElseIf (ValKeyLock=1) #■Option無し処理 If (GCLOCKfUse+FavChkUse=0) PlaySound (ToggleSound) SendCR ("TCPMP") #■Option処理 Else Call ("ToggleToStop") Minimize ("電話 ") Sleep (300) NextOption=1 #■GCLOCKf If (GCLOCKfUse=1) Run (GCLOCKf) ErrorLevel ("syntax") WaitForActive ("電話 ",3) ErrorLevel ("error") Call ("StatusChk") If ( (ValWrapper>0) or (ValLockPhone>=4097) ) #■着信処理 Call ("CallWait") NextOption=0 ElseIf ( (ValProcTCPMP=1) and (ValKeyLock=1) and WndActive ("電話 ") ) #■再生停止処理 PlaySound (ToggleSound) If (ToggleCheck=0) SendCR ("TCPMP") EndIf ToggleCheck=0 NextOption=0 EndIf EndIf #■Favorite If ( (FavChkUse=1) and (NextOption=1) and (ToggleCheck=1) ) PlaySound (FavChkSound) Call ("StatusChk") If ( (ValWrapper>0) or (ValLockPhone>=4097) ) #■着信処理 Call ("CallWait") NextOption=0 ElseIf ( (ValProcTCPMP=1) and (ValKeyLock=1) and WndActive ("電話 ") ) #■お気に入り処理 PlaySound (FavEntSound) Close ("TCPMP") Sleep (300) OpenFavm3u=ReadFile (Favm3uPath,0,"jis") LastPlayTitle=Eval (RegLastPlayTitle) If (Not Find (OpenFavm3u,LastPlayTitle)) WriteFile (Favm3uPath,OpenFavm3u&LastPlayTitle&"^NL^",0,"jis") EndIf Run (TCPMPPath) ErrorLevel ("syntax") WaitFor ("TCPMP",5) ErrorLevel ("error") NextOption=0 EndIf EndIf #■GCLOCKf無し一時停止処理 If ( (GCLOCKfUse<>1) and (NextOption=1) ) PlaySound (ToggleSound) If (ToggleCheck=0) SendCR ("TCPMP") EndIf ToggleCheck=0 NextOption=0 EndIf #■Option出口調査 If ( (Eval (RegWrapper)>0) or (Eval (RegLockPhone)>=4097) ) Call ("CallWait") EndIf CallCheck=0 Call ("ToggleChkRev") EndIf EndIf EndIf Call ("StatusChk") EndWhile #--------------------------------------------------------------- #Sub Script #■Call ("StatusChk") Sub StatusChk ValProcTCPMP=ProcExists ("player.exe") ValKeyLock=Eval (RegKeyLock) ValWrapper=Eval (RegWrapper) ValLockPhone=Eval (RegLockPhone) EndSub #■Call ("ScrAngleChk") Sub ScrAngleChk If (Screen ("portrait")) TCPMP_Y=TCPMP_Y_P Else TCPMP_Y=TCPMP_Y_L EndIf Show ("TCPMP") Sleep (300) EndSub #■Call ("ToggleToStop") Sub ToggleToStop Call ("ScrAngleChk") If (ColorAt (TCPMP_X,TCPMP_Y)<>BaseColor) SendCR ("TCPMP") ToggleCheck=1 EndIf EndSub #■Call ("ToggleChkRev") Sub ToggleChkRev If (ToggleCheck=1) ToggleCheck=0 Call ("ScrAngleChk") If (ColorAt (TCPMP_X,TCPMP_Y)=BaseColor) SendCR ("TCPMP") EndIf EndIf EndSub #■Call ("CallWait") Sub CallWait CallCheck=1 Sleep (1000) While (Eval (RegLockPhone)>=4097) Sleep (5000) EndWhile Sleep (1000) EndSub #■Call ("IfCalling") Sub IfCalling If ( (ValWrapper>0) or (ValLockPhone>=4097) ) If (AutoStop=0) Call ("ToggleChkRev") EndIf Call ("CallWait") Call ("StatusChk") EndIf EndSub #■Call ("DispReOn") Sub DispReOn If (IllumiReOff=1) RetBTBrt=RegRead ("HKCU","ControlPanel\BackLight","BatteryBrightness") RetACBrt=RegRead ("HKCU","ControlPanel\BackLight","ACBrightness") RegWriteDWord ("HKCU","ControlPanel\BackLight","BatteryBrightness",0) RegWriteDWord ("HKCU","ControlPanel\BackLight","ACBrightness",0) Sleep (100) ToggleDisplay (True) Sleep (100) RegWriteDWord ("HKCU","ControlPanel\BackLight","BatteryBrightness",RetBTBrt) RegWriteDWord ("HKCU","ControlPanel\BackLight","ACBrightness",RetACBrt) EndIf EndSub #■Call ("TCPMPScan") スキャンセクション Sub TCPMPScan If ( (ValProcTCPMP=1) and (ScanLock<>1) ) DotPitch = TCPMP_Y_L mod 2 + 1 TCPMP_XScan = TCPMP_X - 7 * DotPitch TCPMP_YScan = TCPMP_Y_L - 9 * DotPitch + Screen ("portrait") * (TCPMP_Y_P - TCPMP_Y_L) Show ("TCPMP") Sleep (300) If ( (ColorAt (TCPMP_XScan, TCPMP_YScan - DotPitch) = BaseColor)\ and (ColorAt (TCPMP_XScan, TCPMP_YScan) <> BaseColor) ) PlaySound (ScanSound) #■確認不一致なら再スキャンして記録 Else If (Screen ("qvga")) DotPitch = 1 Else DotPitch = RegRead ("HKCU","Software\Microsoft\Today","DPI") / 96 EndIf If (Screen ("portrait")) ScrShort = ScreenWidth() AngleAdjust = ScreenHeight() - ScrShort ScanAdjust = AngleAdjust Else ScrShort = ScreenHeight() AngleAdjust = ScreenWidth() - ScrShort ScanAdjust = 0 EndIf #■スキャン開始位置確定 TCPMP_XScan = 12 * DotPitch + 1 - DotPitch TCPMP_YScan = ScrShort - 1 - 22 * DotPitch + ScanAdjust ScrWidth = ScreenWidth() - 1 Show ("TCPMP") Sleep (300) #■平常色を認識 BaseColor = ColorAt (3 * DotPitch, TCPMP_YScan) ColorScan = BaseColor While ( (ColorScan = BaseColor) and (TCPMP_XScan < ScrWidth) ) TCPMP_XScan = TCPMP_XScan + DotPitch ColorScan = ColorAt (TCPMP_XScan, TCPMP_YScan) If (ColorScan <> BaseColor) #■イレギュラーチェック、前面アプリとMenuKeyHelper If (Not WndActive ( "TCPMP")) Show ("TCPMP") Sleep (300) TCPMP_XScan = TCPMP_XScan - DotPitch ElseIf ( ProcExists ("MenuKeyHelper.exe")\ and (ColorAt (TCPMP_XScan, TCPMP_YScan - DotPitch) = ColorScan) ) ColorScan = BaseColor EndIf EndIf EndWhile #■スキャン結果 If (TCPMP_XScan >= ScrWidth) #■失敗 PlaySound ("\Windows\spl_error.wav") Message ("ミディアムVGAを使用していませんか?\ ^NL^他のソフトがTCPMP前面に出てませんか?\ ^NL^スキャン中に画面回転しませんでしたか?\ ^NL^TCPMP_Sp.mscrを終了します。") Exit Else #■成功、スキャン終了位置確定によりボタン位置確定、ファイルに記録 TCPMP_X = TCPMP_XScan + 7 * DotPitch TCPMP_Y_L = TCPMP_YScan + 9 * DotPitch - ScanAdjust TCPMP_Y_P = TCPMP_Y_L + AngleAdjust ThisFile=SystemPath ("ScriptName")&SystemPath ("ScriptExt") ThisFilePath=SystemPath ("ScriptPath")\ThisFile If (FileExists (ThisFilePath)) ThisFileTxt=ReadFile (ThisFilePath,0,"jis") PostFileTxt=Part (ThisFileTxt,"^NL^#LastDataSt",1,0)\ &"^NL^#LastDataSt"\ &"^NL^TCPMP_X="&TCPMP_X\ &"^NL^TCPMP_Y_L="&TCPMP_Y_L\ &"^NL^TCPMP_Y_P="&TCPMP_Y_P\ &"^NL^BaseColor="&BaseColor\ &"^NL^#LastDataEd"\ &Part (ThisFileTxt,"^NL^#LastDataEd",-1,0) Sleep (300) WriteFile (ThisFilePath,PostFileTxt,0,"jis") PlaySound (ScanSound) EndIf EndIf EndIf Call ("StatusChk") EndIf #Message ("TCPMP_X="&TCPMP_X&"^NL^TCPMP_Y_L="&TCPMP_Y_L&"^NL^TCPMP_Y_P="&TCPMP_Y_P&"^NL^BaseColor="&BaseColor) EndSub