|
|||
Delphi Tips | ||
AutoplayHandlers WindowsのCD自動再生への登録方法のソース |
||
ソース(LHA形式)ダウンロードはここを右クリック | ||
|
||
Delphiプログラマーの皆様へ以下ソースはDelphi4で作成しています。 他のバージョンでも恐らく動作すると思われます。 単にレジストリを操作しているだけですので、Delphi以外の言語を お使いの方も、概ね共通で使えると思います。 どうぞご自由にお使いください。 ソースはCD用ですがDVDもほぼ同じ考え方で実現できます。 レジストリーの 「\PlayCDAudioOnArrival」を 「\PlayDVDMovieOnArrival」に変更してくだい。 動作環境:Win7、VISTA、XP、Me、98、95 |
|
■Uses節に「Registry」を加えてください。 ■プログラムは単にレジストリのみを操作するだけです。 レジストリの操作に慣れていない方は、レジストリをバックアップ してから、プログラミングしてください。 (登録ではさほど問題は出ないと思いますが、削除時に誤って親のKeyを 削除してしまうと、回復は絶望的になります。) ■使用ルートKeyは以下の3つです。 Reg.RootKey := HKEY_LOCAL_MACHINE; Reg.RootKey := HKEY_CLASSES_ROOT; Reg.RootKey := HKEY_CURRENT_USER; ■回路の概略 [1][手続き]WindoesCD自動再生への登録 メインのKeyは自動再生に登録するソフトの見出し「HKEY_LOCAL_MACHINE」 実際の実現部(ソフト本体を登録する場所)「HKEY_CLASSES_ROOT」 既定(Default)ソフトに設定する場合は「HKEY_CURRENT_USER」 に、それぞれのKeyや値のデータを書き込みます。 [2][手続き] WindoesCD自動再生の解除 上記で設定したKeyや項目の値、データを削除します。 [3][関数] CD自動再生への登録有無確認 上記で設定したkeyや項目の値、データを探しに行き登録されているかを判定。 ■主なReg操作「手続き」「関数」の捕捉説明 Reg := TRegistry.create;//レジストリを操作出来るようにします。 Create後は、try・・finallyでエラーをトラップして、エラー時にも 必ずRegをfreeで開放できるよにします。 //Keyが存在するか確認関数「BuffPlayCDAudioOnArrival」はKeyのパス KeyExists(BuffPlayCDAudioOnArrival) //キーを開きます。 //キーがが存在しない場合はOpenKeyで作成されます(Trueの場合) OpenKey(BuffPlayCDAudioOnArrival,True); //読み出し専用で開く(Keyを開くことで値や、データを誤操作しない為) //単に読み出す時にはこの方法が良いでしょう。 OpenKeyReadOnly(BuffPlayCDAudioOnArrival); //開いているKeyの項目や値を書き込みます。 //以下は'DefaultIcon'という項目を作成し、値としてアイコンを登録しています。 WriteString('DefaultIcon',ParamStr(0)+',0'); //開いたKeyは必ず閉じます。 CloseKey; 出来るだけコメントを入れてありますので、細かいところは、 ソースを参考にしてください。 |
|
unit Unit1; interface //レジストリの操作を行うのでUses節に「Registry」を加えます。 uses Windows, Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs,Registry; type TForm1 = class(TForm) private { Private 宣言 } //以下、他のFormから呼び出す場合は、Public 宣言へ移動してください。 //[手続き] WindoesCD自動再生への登録 procedure SetRegCDonArrival(AisMainApp:Boolean); //[手続き] WindoesCD自動再生の解除 procedure DelRegCDonArrival; //[関数] CD自動再生への登録有無確認 function QueryPlayCDAudioOnArrival(var AismainAPP:Boolean):Boolean; public { Public 宣言 } end; var Form1: TForm1; implementation //[手続き]WindoesCD自動再生への登録 procedure TForm1.SetRegCDonArrival(AisMainApp:Boolean); var Reg: TRegistry; BuffPlayCDAudioOnArrival,BuffHandlers:String; BuffROOT_Key:String; BuffEventHandlersDefault,BUffStr:String; TempisMainApp:Boolean; begin {以下は、私用関数ですので、通常のMessage表示をお使いください。 //CD自動再生登録有無確認 if QueryPlayCDAudioOnArrival(TempisMainApp) then begin MessageBeep(MB_OK);//[API関数]メッセ-ジビ-プ ShowMyMsg('Kob◆確認', 'Kobさんどは既にCD自動再生に登録されてるので、'+#13#10+ '登録は不要です。', False,True); Exit; end; MessageBeep(MB_OK);//[API関数]メッセ-ジビ-プ if not ShowMyMsg('Kob◆問い合わせ',//20今まで20 'WindowsのCD自動再生ソフトにKobさんどを登録しますか?'+#13#10+#13#10+ 'CD自動再生に登録すると、トレイにCDを挿入すると'+#13#10+ 'Windowsの自動再生画面にKobさんどが表示され、'+#13#10+ 'アイコンをクリックするとKobさんどが起動してCDを再生します。', False,False) then Exit; } Reg := TRegistry.create; with Reg do begin try //■HKEY_LOCAL_MACHINEがCD自動再生の心臓部 Reg.RootKey := HKEY_LOCAL_MACHINE; //[1] 【見出し部】への登録 //システム(Explorer)のCD自動再生メンバー(PlayCDAudioOnArrival)に ソフトを登録 // (通常は既にWinメディアプレーヤなど幾つか登録されている) // Explorerの「AutoplayHandlers」 // 「EventHandlers」「PlayCDAudioOnArrival」のデータ値に追加登録 BuffPlayCDAudioOnArrival := '\SOFTWARE\Microsoft\Windows\CurrentVersion'+ '\Explorer\AutoplayHandlers\EventHandlers'+ '\PlayCDAudioOnArrival'; //■通常は、無いことは可能性は低いが、 // 念の為 PlayCDAudioOnArrivalが存在しているか確認 if KeyExists(BuffPlayCDAudioOnArrival) then begin //キーが存在しない場合もOpenKeyで作成される(Trueの場合) OpenKey(BuffPlayCDAudioOnArrival,True); //キーに関連付けられたデータ値として登録(登録名KobSNDCDAutoplay) WriteString('KobSNDCDAutoplay',''); CloseKey; end; //[2] 【プロファイル部】への登録(ここで設定した参照先を探しに行く) // Explorerの「AutoplayHandlers」「Handlers」にKeyを作成 BuffHandlers:= '\SOFTWARE\Microsoft\Windows\CurrentVersion'+ '\Explorer\AutoplayHandlers\Handlers'; //念の為、Key存在確認 if KeyExists(BuffHandlers) then begin OpenKey(BuffHandlers +'\KobSNDCDAutoplay',True); //ここでは、Keyのデータ値(項目)として各種登録 //●CD自動再生画面表示名 WriteString('Action','オーディオ CD を再生します。'); //●アイコン登録 WriteString('DefaultIcon',ParamStr(0)+',1');//',0' //●HKEY_CLASSES_ROOTのハンドラKey(探しに行く実現部Key) WriteString('InvokeProgID','再生KobさんどCDPlayer'); //●ハンドラKey\Shell\のサブKey(実際に再生ソフトを登録するKey) WriteString('InvokeVerb','KobSND'); //●ソフト供給元名称の登録(通常は会社、ブランド、ソフト名など) WriteString('Provider','KobAppCDPlayer'); CloseKey; end; //[3] 【実行部】への登録 //HKEY_CLASSES_ROOTに実行部のKeyを作成し、Exeファイルを登録 Reg.RootKey := HKEY_CLASSES_ROOT; BuffROOT_Key:= '\再生KobさんどCDPlayer'; //念の為Keyが作成されていないことを確認 if not KeyExists(BuffROOT_Key) then begin //Keyを作成 OpenKey(BuffROOT_Key,True); CloseKey; //一気に「command」Keyまで作成 OpenKey(BuffROOT_Key+'\shell\KobSND\command',True); //ここで再生ソフトの場所を指定(パラメーターは「%L」) WriteString('',ParamStr(0)+ ' "%L"');//登録名KobSNDCDAutoplay CloseKey; end; //[4] デフォルトに登録する場合は以下処理 if AisMainApp then begin Reg.RootKey := HKEY_CURRENT_USER; BuffEventHandlersDefault := '\Software\Microsoft\Windows\CurrentVersion\Explorer'+ '\AutoplayHandlers\EventHandlersDefaultSelection'; //Keyがあるなら、Defaultに登録されているソソフ名をバックアップ後に //値のデータを当該ソフトのハンドラーにする if KeyExists(BuffEventHandlersDefault) then begin //**OpenKey(BuffEventHandlersDefault,False); OpenKeyReadOnly(BuffEventHandlersDefault); BUffStr := ReadString('PlayCDAudioOnArrival'); CloseKey; //他のソフトが登録されている場合はバックアップ if (BuffStr <> '') and (BUffStr <> 'KobSNDCDAutoplay') then begin OpenKey(BuffEventHandlersDefault+'\KobEventDefault',True); WriteString('',BUffStr); end; //ここで実際のDefaultソフトとして値のデータを設定 OpenKey(BuffEventHandlersDefault,True); WriteString('PlayCDAudioOnArrival','KobSNDCDAutoplay'); CloseKey; end; end; //システムに変更を通知(アイコンがリフレッシュされる) SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_FLUSH,nil,nil); finally free; end; end; {以下は、私用関数ですので、通常のMessage表示をお使いください。 //[MyRegUnitSプロ]カスタマイズMsgBox MessageBeep(MB_OK);//[API関数]メッセ-ジビ-プ if AisMainApp then ShowMyMsg('Kob◆確認', 'WindowsのCD自動再生ソフトに、Kobさんどを登録しました。'+#13#10+#13#10+ '■既定ソフト(デフォルト)として設定されました。', False,True) else ShowMyMsg('Kob◆確認', 'WindowsのCD自動再生ソフトに、Kobさんどを登録しました。'+#13#10+#13#10+ '■自動再生ソフトの一員として設定されました。', False,True); } end; //[手続き] WindoesCD自動再生の解除 procedure TForm1.DelRegCDonArrival; var Reg: TRegistry; BuffPlayCDAudioOnArrival,BuffHandlers:String; BuffResultDelKey,BuffResultDelVal,BuffResultROOT_Key :Boolean; BuffROOT_Key:String; BuffEventHandlersDefault,BUffStr,BuffStr2:String; TempisMainApp:Boolean; begin {以下は、私用関数ですので、通常のMessage表示をお使いください。 //CD自動再生登録有無確認 if not QueryPlayCDAudioOnArrival(TempisMainApp) then begin MessageBeep(MB_OK);//[API関数]メッセ-ジビ-プ Form1.ShowMyMsg('Kob◆確認', 'Kobさんどは既にCD自動再生より解除されてるので、'+#13#10+ '解除する必要はありません。', False,True); Exit; end; MessageBeep(MB_OK);//[API関数]メッセ-ジビ-プ if not TForm1.ShowMyMsg('Kob◆問い合わせ',//20今まで20 'WindowsのCD自動再生ソフトよりKobさんどを解除しますか?'+#13#10+#13#10+ 'この操作はKobのみが解除され他のソフトに影響を与えることはありません。'+#13#10+ 'Kobさんどの解除処理は、完全に元の状態に戻ります。', False,False) then Exit; } Reg := TRegistry.create; with Reg do begin try BuffResultDelKey := False; BuffResultDelVal := False; Reg.RootKey := HKEY_LOCAL_MACHINE; //[1]【見出し部】より削除 // システム(Explorer)のCD自動再生メンバーからソフト名を削除 BuffPlayCDAudioOnArrival := '\SOFTWARE\Microsoft\Windows\CurrentVersion'+ '\Explorer\AutoplayHandlers\EventHandlers'+ '\PlayCDAudioOnArrival'; //■Keyがあるならデータ値(項目名)を削除(DeleteValue) if KeyExists(BuffPlayCDAudioOnArrival) then begin OpenKey(BuffPlayCDAudioOnArrival,True); BuffResultDelVal := DeleteValue('KobSNDCDAutoplay');//登録名KobSNDCDAutoplay CloseKey; end; //[2] 【プロファイル部】より「Handler」Keyを削除(DeleteKey) // Explorerの「AutoplayHandlers」「Handlers」にKeyを作成 BuffHandlers:= '\SOFTWARE\Microsoft\Windows\CurrentVersion'+ '\Explorer\AutoplayHandlers\Handlers'; if KeyExists(BuffHandlers) then begin OpenKey(BuffHandlers +'\KobSNDCDAutoplay',True); BuffResultDelKey := DeleteKey(BuffHandlers +'\KobSNDCDAutoplay');//登録名KobSNDCDAutoplay CloseKey; end; //[3] 【実行部】HKEY_CLASSES_ROOTのKeyを削除 Reg.RootKey := HKEY_CLASSES_ROOT; BuffROOT_Key:= '\再生KobさんどCDPlayer'; //Keyがあるなら(DeleteKey)削除 if KeyExists(BuffROOT_Key) then begin BuffResultROOT_Key := DeleteKey(BuffROOT_Key); CloseKey; end; //[4] デフォルトに登録されているならデータ値削除 Reg.RootKey := HKEY_CURRENT_USER; BuffEventHandlersDefault := '\Software\Microsoft\Windows\CurrentVersion\Explorer'+ '\AutoplayHandlers\EventHandlersDefaultSelection'; //Keyがあるなら、Defaultに登録されているソフト名を確認後に //当該ソフトなら、値のデータを空欄にする if KeyExists(BuffEventHandlersDefault) then begin OpenKey(BuffEventHandlersDefault,False);//True); BUffStr := ReadString('PlayCDAudioOnArrival'); //Kobさんどが登録されている場合のみ空欄にする。 if BUffStr = 'KobSNDCDAutoplay' then WriteString('PlayCDAudioOnArrival',''); CloseKey; //バックアップ有るなら、初期値のデータに戻す if KeyExists(BuffEventHandlersDefault+'\KobEventDefault') then begin //OpenKey(BuffEventHandlersDefault+'\KobEventDefault',False);//True); //読み出し専用で開く OpenKeyReadOnly(BuffEventHandlersDefault+'\KobEventDefault'); BUffStr2 := ReadString(''); CloseKey; OpenKey(BuffEventHandlersDefault,True); WriteString('PlayCDAudioOnArrival',BUffStr2); CloseKey; end; end; //システムに変更を通知 SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_FLUSH,nil,nil); finally free; end;//try end;//reg if BuffResultDelKey and BuffResultDelVal and BuffResultROOT_Key then begin {以下は、私用関数ですので、通常のMessage表示をお使いください。 //[MyRegUnitSプロ]カスタマイズMsgBox MessageBeep(MB_OK);//[API関数]メッセ-ジビ-プ Form1.ShowMyMsg('Kob◆確認', 'WindowsのCD自動再生ソフトより、Kobさんどを解除しました。', False,True); } end; end; //[関数] CD自動再生への登録有無確認 function TForm1.QueryPlayCDAudioOnArrival(var AismainAPP:Boolean):Boolean; var Reg: TRegistry; BuffResultCDAudioOnArrival,BuffResultHandlersKey,BuffResultROOT_Key :Boolean; BuffPlayCDAudioOnArrival,BuffHandlers:String; BuffROOT_Key:String; BuffEventHandlersDefault,BUffStr:String; begin Result := False; Reg := TRegistry.create; with Reg do begin try BuffResultCDAudioOnArrival := False; BuffResultHandlersKey := False; BuffResultROOT_Key := False; Reg.RootKey := HKEY_LOCAL_MACHINE; //[1] 【見出し部】 //システム(Explorer)のCD自動再生メンバーのソフト名確認 BuffPlayCDAudioOnArrival := '\SOFTWARE\Microsoft\Windows\CurrentVersion'+ '\Explorer\AutoplayHandlers\EventHandlers'+ '\PlayCDAudioOnArrival'; //■Keyがあるならデータ値(項目名)を確認 if KeyExists(BuffPlayCDAudioOnArrival) then begin //**OpenKey(BuffPlayCDAudioOnArrival,False); //読み出し専用で開く OpenKeyReadOnly(BuffPlayCDAudioOnArrival); //登録名が含まれているか確認(KobSNDCDAutoplay) // 以下使うとエラー // GetValueNames(BuffStrings); // if BuffStrings.IndexOf('KobSNDCDAutoplay') >= 0 then // BuffResultCDAudioOnArrival := True; //データ値(項目名)が有るか確認 BuffResultCDAudioOnArrival := ValueExists('KobSNDCDAutoplay'); CloseKey; end; //[2] 【プロファイル部】より「Handler」Key有無確認 BuffHandlers:= '\SOFTWARE\Microsoft\Windows\CurrentVersion'+ '\Explorer\AutoplayHandlers\Handlers'; if KeyExists(BuffHandlers +'\KobSNDCDAutoplay') then begin BuffResultHandlersKey := TRue; end; //[3] 【実行部】 //HKEY_CLASSES_ROOTの存在有無 Reg.RootKey := HKEY_CLASSES_ROOT; BuffROOT_Key:= '\再生KobさんどCDPlayer'; //Keyがあるなら if KeyExists(BuffROOT_Key) then begin BuffResultROOT_Key := True; end; //総合判定 Resultで返す if BuffResultCDAudioOnArrival and BuffResultHandlersKey and BuffResultROOT_Key then begin Result := True; end; //[4] デフォルト(既定)に登録されているか否か問い合わせ Reg.RootKey := HKEY_CURRENT_USER; BuffEventHandlersDefault := '\Software\Microsoft\Windows\CurrentVersion\Explorer'+ '\AutoplayHandlers\EventHandlersDefaultSelection'; //Keyがあるなら、Defaultに登録されているソソフ名を取得 if KeyExists(BuffEventHandlersDefault) then begin // OpenKey(BuffEventHandlersDefault,False);//True); //読み出し専用で開く OpenKeyReadOnly(BuffEventHandlersDefault); BUffStr := ReadString('PlayCDAudioOnArrival'); //Kobさんどが登録されている場合Trueを返す。 if BUffStr = 'KobSNDCDAutoplay' then begin AismainAPP := True; end //他のソフトが登録されている場合False else begin AismainAPP := False; end; CloseKey; end; finally free; end;//try end;//reg end; |
|
||