static bool WriteRegistry()
{
try
{
// 로컬호스트 관리자그룹을 사용해서 레지스트리 쓰기 권한을 할당한다.
// 도메인에 속하는 컴퓨터인 경우 아래 코드가 잘 될지 안될지 모르겠다.
RegistryAccessRule allow_write_rule = new RegistryAccessRule(new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, null), RegistryRights.FullControl, AccessControlType.Allow);
RegistrySecurity securitySettings = new RegistrySecurity();
securitySettings.AddAccessRule(allow_write_rule);
// MSDN의 샘플은 HKEY_CLASSROOT 에 저장하게 되어있는데
// HKEY_CURRENT_USER 에 저장하는걸 권장한다고 하더라.
// 난 그냥 HKEY_LOCAL_MACHINE 에 저장한다.
RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Classes", RegistryKeyPermissionCheck.ReadWriteSubTree);
key.SetAccessControl(securitySettings);
// 스키마 생성
RegistryKey reg_base = key.CreateSubKey("mytro.RecPlayer");
if (null == reg_base)
return false;
// 기본값 설정
reg_base.SetValue("", "mytro record player URI", RegistryValueKind.String);
// 이게 꼭 필요한지는 모르겠음
reg_base.SetValue("Content Type", "application/x-mytrorec", RegistryValueKind.String);
// 이게 있어야 브라우저에서 클릭했을때 동작한다.
reg_base.SetValue("URL Protocol", "", RegistryValueKind.String);
// icon 설정
RegistryKey icon = reg_base.CreateSubKey("DefaultIcon");
if (null == icon)
return false;
icon.SetValue("", @"C:\MYTRO\RecordPlayer\MytroPlayer.exe,1", RegistryValueKind.String);
// 핸들러 설정 (shell open 을 만들어준다.)
RegistryKey shell = reg_base.CreateSubKey("shell");
if (null == shell)
return false;
shell.SetValue("", "open", RegistryValueKind.String);
RegistryKey open = shell.CreateSubKey("open");
if (null == open)
return false;
RegistryKey command = open.CreateSubKey("command");
if (null == command)
return false;
// 실행파일도 Environment.SpecialFolder.ApplicationData 에 넣고 사용하는걸 권장하는데 왜 그런지는 잘 모르겠음...
// 저 규칙에 따른다면 경로는 이렇게 된다. C:/Users/홍준기/AppData/Roaming/RecordPlayer/MytroPlayer.exe
command.SetValue("", @"""C:\MYTRO\RecordPlayer\MytroPlayer.exe"" ""%1""", RegistryValueKind.String);
return true;
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
return false;
}