Aslında bütün iş windows registry kayıtlarında dönüyor ve tüm işlemler HKEY_CLASSES_ROOT kök dizini altından gerçekleşiyor. Ayrıca registry için varsayılan anahtar (dizin) değeri olarak belirttiğim değerler isimsiz değelerdir ve @ karakteri kullandım. Örnek olarak akm uzantısı kaydı yapalım.
İlk iş uzantının solunda nokta '.' olacak şekilde bir dizin oluşturmak ve varsayılan değer olarak bir isim yazmak olacak.
HKEY_CLASSES_ROOT\.akm dizini oluşturulur ve varsayılan değer olarak bir isim yazılır. Bu isim asıl bilgilerin yazılacağı registry dizin ismidir.
.........|->@='akmDosyasi' -> yazalım. Artık .akm uzantısına ait bilgiler akmDosyasi registry dizini içerisindedir.
HKEY_CLASSES_ROOT\akmDosyasi .akm uzantısına ilişkin bilgiler bu dizindedir
.........|->@='akm Dosya Arşiv Türü' -> yazarsak, windows bize o dosyaya ait tür açıklasında bu bilgiyi gösterir.
HKEY_CLASSES_ROOT\akmDosyasi\DefaultIcon anahtar dizininde yazan değer ise o dosya türüne ait simgeyi belirler
.........|->@='c:\deneme\program.exe,0' -> .exe içinde bulunan simgelerden ilkini kullan
veya
.........|->@='c:\deneme\simge.ico' -> değeri ile o türden dosya artık yazdığımız simgeyi gösterir
Gelelim dosya türüne ait programı ilişkilendirmeye. Bu değerler ise HKEY_CLASSES_ROOT\akmDosyasi\shell altında bulunur ve yine burada bulunan open anahtarındaki varsayılan değer dolu ise o dosya sağ tıklanınca Aç seçeneği yerinde bu değer yazar.
HKEY_CLASSES_ROOT\akmDosyasi\shell\open
.........|->@='Akm Dosyası Açılıyor' Bu değer boşsa menüde Aç görünür (dile göre değişir). Bu değer dolu ise Aç yerine bu değer yazar.
HKEY_CLASSES_ROOT\akmDosyasi\shell\open\command
.........|->@='"c:\deneme\program.exe" "%1"'
Not..:Burada bulunan %1 bilgisi ilgili dosyayı 1. parametre olarak programa gönderir. Program içinden bu bilgi ParamStr(1) fonksiyonu ile elde edilir. Bknz..:ParamCount, ParamStr.
Eğer bu dosya türüne sağ tuş menüsü olarak ek seçenekler eklenmek isterse shell dizini altına kendi tanımlarımızı yapıp ek yapabiliriz. Mesela menüden Yeni Seçenek olarak görünen bir Deneme işlevi ekleyelim.
HKEY_CLASSES_ROOT\akmDosyasi\shell\Deneme
.........|->@='Akm &Deneme Menüsü' -> O türden dosyaya sağ tıklayınca bu menü seçeneği eklenir. Eğer boşsa bu menü seçeneğinde Deneme yazar.
HKEY_CLASSES_ROOT\akmDosyasi\shell\Deneme\command
.........|->@='"c:\deneme\program.exe" "%1" "/yazdir"' ->O dosyaya ait sağ tuş menüsünden seçim yapılınca çalışacak işlev tanımı. 1. parametre dosya adı, 2. parametre ise /yazdir'dır. Tabi parametreye göre işlem yapmak programa kalmış. Bknz..:ParamCount, ParamStr.
Bu konuda bir kaç kod karalamadan da paylaşım yapmak istemedim, Aşağıda verdiğim unit'le dosya türü kaydı yapılabilir, tür silinebilir, simge değiştirilebilir, o dosya türüne ait popup menü seçeneği eklenip, menü seçeneği silinebilir. Tabi burada sadece ekleme dışındaki tüm işlemler dosya türü kayıtlı ise çalışmaktadır. Ayrıca sadece registry bilgisi ile işlem yapıldığında dosya türüne ait görüntü değişimi oturum kapanmadan veya bir şekilde windows ekran görüntüsü tazelenmeden sağlanamamaktadır. Bununla ilgili simge görüntü tazeleme kodu da RefreshDesktop prosedüründe mevcut ve gerekli olduğunda çalışmaktadır. DosyaTurleri.pas dosyası..:
Kod: Tümünü seç
unit DosyaTurleri;
interface
uses Registry;
type
TDosyaTuru=record
Uzanti,
UzantiAciklamasi,
SimgeDosyasi,
SagTusMenusu,SagTusMenuParam,SagTusMenuAciklamasi,
ProgramAdi:String;
end;
function DosyaTuruKaydet(DosyaTuru:TDosyaTuru;const TurVarsaDegistir:Boolean=False):Boolean;
function DosyaTuruSil(Uzanti:String):Boolean;
//Dosya türü kayıtlı ise çalışır
function DosyaTuruSimgesiDegistir(Uzanti:String;const SimgeDosyasi:String):Boolean;
//Dosya türü kayıtlı ise çalışır
function DosyaTuruMenuSecengiEkle(Uzanti:String;const MenuSecenegi,ProgramAdi:String;const MenuSecenekAciklamasi:String='';const EkParam:String=''):Boolean;
//Dosya türü kayıtlı ise çalışır
function DosyaTuruMenuSecengiSil(Uzanti:String;const MenuSecenegi:String):Boolean;
//Dosya türü kayıtlı ise çalışır
implementation
uses Forms, Messages, Windows, SysUtils, ShlObj;
var Reg:TRegistry;
function RPos(const C:Char;const S:String):Integer;
begin
Result:=Length(S);
while (Result>0) and (S[Result]<>C) do Dec(Result);
end;
procedure RefreshDesktop;
var DH: HWND;
begin
DH := FindWindowEx(FindWindowEx(FindWindow('Progman', 'Program Manager'), 0,'SHELLDLL_DefView', ''), 0, 'SysListView32', '');
PostMessage(DH, WM_KEYDOWN, VK_F5, 0);
PostMessage(DH, WM_KEYUP, VK_F5, 1 shl 31);
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil);
end;
const
DefaultIcon='DefaultIcon';
shell='shell';
open='open';
command='command';
VarsayilanAnahtarAdi='';
procedure RegReset(const RootKey:HKey=HKEY_CLASSES_ROOT);
begin
Reg.RootKey:=RootKey;
Reg.CloseKey;
end;
function DosyaTuruKaydet(DosyaTuru:TDosyaTuru;const TurVarsaDegistir:Boolean):Boolean;
var S,TurDetayDizini:String;
begin
Result:=Trim(DosyaTuru.Uzanti)<>'';
if not Result then Exit;//uzantı yoksa çalıştırma
RegReset;
with DosyaTuru do try
TurDetayDizini:=Uzanti+'Dosyasi';
if TurDetayDizini[1]='.' then Delete(TurDetayDizini,1,1);
if Trim(UzantiAciklamasi)='' then UzantiAciklamasi:=Format('%s Dosya Tipi',[Uzanti]);
if Uzanti[1]<>'.' then Uzanti:='.'+Uzanti;
Result:=Reg.OpenKey(Uzanti,False);
if Result then begin //dosya türü kayıtlı
Result:=TurVarsaDegistir;
TurDetayDizini:=Reg.ReadString(VarsayilanAnahtarAdi); //bu tip zaten bu dizinde kayıtlı
end else begin //dosya türü kayıtta yok
Result:=Reg.OpenKey(Uzanti,True);
if Result then Reg.WriteString(VarsayilanAnahtarAdi,TurDetayDizini);
//dosya türü gilgileri bu dizinde yazılacak, kullanıcı yetkisi varsa oluşturulur
end;
if Result then begin
//eğer değiştirilecek veya oluşturulacak dosya türüyse işlem devam eder
Reg.CloseKey;//açılan dizinler geri kapanır, kök dizinden çalışma devam eder
Result:=Reg.OpenKey(TurDetayDizini,True);
if Result then begin
if Trim(UzantiAciklamasi)<>'' then Reg.WriteString(VarsayilanAnahtarAdi,UzantiAciklamasi);
if Trim(SimgeDosyasi)<>'' then begin
Reg.OpenKey(DefaultIcon,True);
Reg.WriteString(VarsayilanAnahtarAdi,SimgeDosyasi);
Reg.CloseKey;Reg.OpenKey(TurDetayDizini,True);
end;
ProgramAdi:=Trim(ProgramAdi);
if ProgramAdi[1]<>'"' then ProgramAdi:=Format('"%s"',[ProgramAdi]);
if ProgramAdi<>'' then begin
Reg.OpenKey(shell,True);
Reg.OpenKey(open,True);
Reg.OpenKey(command,True);
Reg.WriteString(VarsayilanAnahtarAdi,Format('%s "%%1"',[ProgramAdi]));
Reg.CloseKey;Reg.OpenKey(TurDetayDizini,True);
end;
if Trim(SagTusMenusu)<>'' then begin
Reg.OpenKey(shell,True);
Reg.OpenKey(SagTusMenusu,True);
if Trim(SagTusMenuAciklamasi)<>'' then Reg.WriteString(VarsayilanAnahtarAdi,SagTusMenuAciklamasi);
Reg.OpenKey(command,True);
if Trim(SagTusMenuParam)<>'' then S:=Format(' "%s"',[SagTusMenuParam]) else S:='';
Reg.WriteString(VarsayilanAnahtarAdi,Format('%s "%%1"%s',[ProgramAdi,S]));
Reg.CloseKey;Reg.OpenKey(TurDetayDizini,True);
end;
end;
end;
except
Result:=False;
end;
RefreshDesktop;
end;
function DosyaTuruSil(Uzanti:String):Boolean;
var TurDetayDizini:String;
begin
Result:=Trim(Uzanti)<>'';
if not Result then Exit;//uzantı yoksa çalıştırma
if Uzanti[1]<>'.' then Uzanti:='.'+Uzanti;
RegReset;
try
Result:=Reg.OpenKey(Uzanti,False);
if Result then begin //Dosya türü var, silinecek
TurDetayDizini:=Reg.ReadString(VarsayilanAnahtarAdi);//Bu tür burada kayıt detayına sahip
Reg.CloseKey;
Result:=Reg.DeleteKey(TurDetayDizini) and Reg.DeleteKey(Uzanti);//uzantıya ait bilgiler silinir
end;
except
Result:=False;
end;
RefreshDesktop;
end;
function DosyaTuruSimgesiDegistir(Uzanti:String;const SimgeDosyasi:String):Boolean;
var S,TurDetayDizini:String; i:Integer;
begin
Result:=Trim(Uzanti)<>'';
i:=RPos(',',SimgeDosyasi);
if i>0 then S:=Copy(SimgeDosyasi,1,i-1) else S:=SimgeDosyasi;
if not Result or not FileExists(S) then Exit;//uzantı veya simge dosyası yoksa çalıştırma
if Uzanti[1]<>'.' then Uzanti:='.'+Uzanti;
RegReset;
try
Result:=Reg.OpenKey(Uzanti,False);
if Result then begin //Dosya türü var, silinecek
TurDetayDizini:=Reg.ReadString(VarsayilanAnahtarAdi);//Bu tür burada kayıt detayına sahip
Reg.CloseKey;
Result:=Reg.OpenKey(TurDetayDizini,False);
if Result then Result:=Reg.OpenKey(DefaultIcon,False);
if Result then Reg.WriteString(VarsayilanAnahtarAdi,SimgeDosyasi);
end;
except
Result:=False;
end;
RefreshDesktop;
end;
function DosyaTuruMenuSecengiEkle(Uzanti:String;const MenuSecenegi,ProgramAdi,MenuSecenekAciklamasi,EkParam:String):Boolean;
var S,TurDetayDizini:String;
begin
Result:=Trim(Uzanti)<>'';
if not Result or not FileExists(ProgramAdi) or (Trim(MenuSecenegi)='') then Exit;//uzantı veya program dosyası veya menü seçeneğinin adı yoksa çalıştırma
if Uzanti[1]<>'.' then Uzanti:='.'+Uzanti;
RegReset;
try
Result:=Reg.OpenKey(Uzanti,False);
if Result then begin //Dosya türü var, silinecek
TurDetayDizini:=Reg.ReadString(VarsayilanAnahtarAdi);//Bu tür burada kayıt detayına sahip
Reg.CloseKey;
Result:=Reg.OpenKey(TurDetayDizini,False);
if Result then begin
Reg.OpenKey(shell,True);
Reg.OpenKey(MenuSecenegi,True);
if Trim(MenuSecenekAciklamasi)<>'' then Reg.WriteString(VarsayilanAnahtarAdi,MenuSecenekAciklamasi);
Reg.OpenKey(command,True);
if Trim(EkParam)<>'' then begin
if EkParam[1]<>'"' then S:=Format(' "%s"',[EkParam]);
end else S:='';
Reg.WriteString(VarsayilanAnahtarAdi,Format('%s "%%1"%s',[ProgramAdi,S]));
end;
end;
except
Result:=False;
end;
//RefreshDesktop;
end;
function DosyaTuruMenuSecengiSil(Uzanti:String;const MenuSecenegi:String):Boolean;
var TurDetayDizini:String;
begin
Result:=Trim(Uzanti)<>'';
if not Result or (Trim(MenuSecenegi)='') then Exit;//uzantı veya menü seçeneğinin adı yoksa çalıştırma
if Uzanti[1]<>'.' then Uzanti:='.'+Uzanti;
RegReset;
try
Result:=Reg.OpenKey(Uzanti,False);
if Result then begin //Dosya türü var, silinecek
TurDetayDizini:=Reg.ReadString(VarsayilanAnahtarAdi);//Bu tür burada kayıt detayına sahip
Reg.CloseKey;
Result:=Reg.OpenKey(TurDetayDizini,False);
if Result then begin
Reg.OpenKey(shell,True);
Result:=Reg.DeleteKey(MenuSecenegi);
end;
end;
except
Result:=False;
end;
//RefreshDesktop;
end;
initialization
Reg:=TRegistry.Create; //müsriflik olmasın, 1 tane yapalım hep onu kullanalım :)
finalization
Reg.Free;
end.
Kod: Tümünü seç
//Dosya Türü Eklemesi, kullanılmayacak özellikler boşaltılmalı
var DosyaTuru:TDosyaTuru;
begin
DosyaTuru.Uzanti:='akm';
DosyaTuru.UzantiAciklamasi:=Format('%s Arşivi',[DosyaTuru.Uzanti]);
DosyaTuru.SimgeDosyasi:=Format('%s,0',[Application.ExeName]);
DosyaTuru.ProgramAdi:=Application.ExeName;
DosyaTuru.SagTusMenusu:='MenudenAkmanAc';
DosyaTuru.SagTusMenuParam:='/msg';
DosyaTuru.SagTusMenuAciklamasi:='Akman Dosyası Açıver Gari';
if DosyaTuruKaydet(DosyaTuru,True) then ShowMessage('Dosya tipi kayıt edildi')
else MessageBox(Handle,'Tür kayıt işlemi yapılamadı','Uyarı',MB_ICONWARNING);
end;
//Dosya Türü Eklemesi, (faklı yol)
var DosyaTuru:TDosyaTuru;
begin
DosyaTuru.Uzanti:='akm';
DosyaTuru.UzantiAciklamasi:=Format('%s Arşivi',[DosyaTuru.Uzanti]);
DosyaTuru.SimgeDosyasi:=Format('%s,0',[Application.ExeName]);
DosyaTuru.ProgramAdi:=Application.ExeName;
DosyaTuru.SagTusMenusu:='';
DosyaTuru.SagTusMenuParam:='';
DosyaTuru.SagTusMenuAciklamasi:='';
if DosyaTuruKaydet(DosyaTuru,True) then ShowMessage('Dosya tipi kayıt edildi')
else MessageBox(Handle,'Tür kayıt işlemi yapılamadı','Uyarı',MB_ICONWARNING);
end;
//ilgili dosya türü kaydını silme
if DosyaTuruSil('akm') then ShowMessage('Dosya tipi silindi')
else MessageBox(Handle,'Tür silinemedi','Uyarı',MB_ICONWARNING);
//dosya türüne ait simgenin değiştirilmesi
if DosyaTuruSimgesiDegistir('akm',ExtractFilePath(Application.ExeName)+'Simge.ico') then ShowMessage('Dosya tipi simgesi değişti')
else MessageBox(Handle,'Simge değiştirilemedi','Uyarı',MB_ICONWARNING);
//ilgili dosya türüne ait popup menü seçeneği ekleme
if DosyaTuruMenuSecengiEkle('akm','Denemesi',Application.ExeName,'Bu da yeni seçenek','/şaban şahin akman') then ShowMessage('Dosya tipi menüsü eklendi')
else MessageBox(Handle,'Menü eklenemedi','Uyarı',MB_ICONWARNING);
//ilgili dosya türüne ait popup menü seçeneği varsa silme
if DosyaTuruMenuSecengiSil('akm','Denemesi') then ShowMessage('Dosya tipi menüsü silindi')
else MessageBox(Handle,'Menü silinemedi','Uyarı',MB_ICONWARNING);