カスタム検索
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;


Kobロゴ