自定义文件格式注册和图标设置

我们很多时候可能会有这样的一种需求,即要生成自己的文件格式,然后将这种文件格式注册到操作系统中,双击就会使用特定的程序来打开,并且我们还想为这种文件格式设置一个图标和缩略。本文章解决的是注册文件格式和设置文件的图标,至于缩略图的设置请看我空间的另外一篇文章。
 注册文件需要用到下面两个函数:
BOOL RegeditYourFile(string ExtName)
{
	CString csKey = ExtName.c_str();
    CString m_csDocumentClassName = "YourFileExtName.file";


	::GetModuleFileName(NULL, szProgPath, sizeof(szProgPath)/sizeof(TCHAR));//本执行程序的路径,用来在命令模式下也可以打开该
	//类型的文件

	CString csTempText;

	// just pass file path in quotes on command line
	csTempText  = szProgPath;
	csTempText += " /"%1/"";

	CString m_csShellOpenCommand = csTempText;
	SetRegistryValue(HKEY_CLASSES_ROOT, csKey, "", m_csDocumentClassName);//注册一个.VTemplate后缀的主键

	if( !m_csShellOpenCommand.IsEmpty() )
	{//注册命令模式下打开该类型文件的执行程序
		csKey += "//shell//open//command";
		SetRegistryValue(HKEY_CLASSES_ROOT, csKey, "", m_csShellOpenCommand);
	}

	csKey = m_csDocumentClassName;

	CString m_csDocumentDescription = "";
	
	csTempText  = szProgPath;

	csTempText += ",1";
	CString m_csDocumentDefaultIcon = csTempText;

	SetRegistryValue(HKEY_CLASSES_ROOT, csKey, "", m_csDocumentDescription);

	// DefaultIcon
	if( !m_csDocumentDefaultIcon.IsEmpty() )
	{
		csKey  = m_csDocumentClassName;
		csKey += "//DefaultIcon";
		SetRegistryValue(HKEY_CLASSES_ROOT, csKey, "", m_csDocumentDefaultIcon);
	}

	// shell/open/command
	if( !m_csShellOpenCommand.IsEmpty() )
	{
		csKey  = m_csDocumentClassName;
		csKey += "//shell//open//command";
		SetRegistryValue(HKEY_CLASSES_ROOT, csKey, "", m_csShellOpenCommand);
	}
   return TRUE;
}



BOOL SetRegistryValue(HKEY hOpenKey,LPCTSTR szKey,LPCTSTR szValue,LPCTSTR szData)
{
	// validate input
	if( !hOpenKey || !szKey || !szKey[0] || 
	   !szValue || !szData )
    {
		::SetLastError(E_INVALIDARG);
		return FALSE;
	}

	BOOL 	bRetVal = FALSE;
	DWORD	dwDisposition;
	DWORD	dwReserved = 0;
	HKEY  	hTempKey = (HKEY)0;

			// length specifier is in bytes, and some TCHAR 
			// are more than 1 byte each
	DWORD	dwBufferLength = lstrlen(szData) * sizeof(TCHAR);

	// Open key of interest
	// Assume all access is okay and that all keys will be stored to file
	// Utilize the default security attributes
	if( ERROR_SUCCESS == ::RegCreateKeyEx(hOpenKey, szKey, dwReserved,
				                 (LPTSTR)0, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, 0,
				                 &hTempKey, &dwDisposition) )
	{

	// dwBufferLength must include size of terminating nul 
	// character when using REG_SZ with RegSetValueEx function
		dwBufferLength += sizeof(TCHAR);

	if( ERROR_SUCCESS == ::RegSetValueEx(hTempKey, (LPTSTR)szValue,
						                 dwReserved, REG_SZ, (LPBYTE)szData, 
										 dwBufferLength) )
	{
							bRetVal = TRUE;
	}
	}

	// close opened key
	if( hTempKey )
	{
		::RegCloseKey(hTempKey);
	}

	return bRetVal;
其中里面的原理主要是操作注册表,具体自己看。
比如,你想为自己的自定义文件格式.why注册,则可以这样子调用上面的函数:
RegeditYourFile(.why);
注册完文件格式以后,要给这种文件格式设置一个图标,这要用到下面的函数:
BOOL  ModifyIcon(LPCSTR   ExtName,   LPCSTR   IconFile) 
{
	    BOOL   ret;  
          LONG   nLen;  
          char   Key[65];  
          char   buf[MAX_PATH];  
   
          nLen   =   sizeof(Key);  
          if   (RegQueryValue(HKEY_CLASSES_ROOT,ExtName,Key,  
                  &nLen)   !=   ERROR_SUCCESS)  
                  return   FALSE;  
          if   (Key[0]=='/0')   return   FALSE;  
          strcat(Key,   "//DefaultIcon");  
          strcpy(buf,   IconFile);     strcat(buf,   ",   0");  
          ret   =   RegSetValue(HKEY_CLASSES_ROOT,   Key,  
                  REG_SZ,   buf,   sizeof(buf)+1)   ==   ERROR_SUCCESS;  
          SHChangeNotify(SHCNE_ASSOCCHANGED,SHCNF_FLUSHNOWAIT,  
                  0,   0);  
          return   ret;  
}
然后你可以这样子调用:
ModifyIcon(".why","C://myicon.ico");
搞定。
PS:很多人从我这里学到或拿走东西,没人说句3Q,郁闷。

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
注册文件图标的 API 是 `registerIconTheme`,它属于 VS Code 扩展 API 的 `extensions` 模块。该 API 可以注册一个包含文件类型图标的主题,让用户在 VS Code 中看到自定义文件类型图标。 `registerIconTheme` 方法的定义如下: ```typescript function registerIconTheme(theme: IconTheme): Disposable; ``` 其中,`IconTheme` 是一个接口类型,定义了一个包含文件类型图标的主题,它的定义如下: ```typescript interface IconTheme { /** * 主题名称 */ id: string; /** * 文件类型图标的定义 */ icons: { [fileType: string]: IconPath }; } ``` `IconTheme` 接口中的 `id` 属性表示主题名称,`icons` 属性是一个对象,用于定义各个文件类型对应的图标。在 `icons` 对象中,键表示文件类型(例如 `.js`、`.html` 等等),值是一个 `IconPath` 对象,表示该文件类型对应的图标路径。 `IconPath` 的定义如下: ```typescript interface IconPath { /** * 普通尺寸下的图标路径 */ light: string | Uri; /** * 高对比度主题下的图标路径 */ dark: string | Uri; } ``` `IconPath` 接口中的 `light` 属性表示在普通主题下使用的图标路径,`dark` 属性表示在高对比度主题下使用的图标路径。这两个属性的值可以是字符串类型的相对路径,也可以是 `Uri` 类型的绝对路径。 使用 `registerIconTheme` 方法可以将自定义文件类型图标主题注册到 VS Code 中,并返回一个 `Disposable` 对象,用于在扩展卸载时取消注册。例如: ```typescript import * as vscode from 'vscode'; export function activate(context: vscode.ExtensionContext) { const customIconTheme: vscode.IconTheme = { id: 'my-icon-theme', icons: { '.myext': { light: 'path/to/light/icon', dark: 'path/to/dark/icon' } } }; const disposable = vscode.extensions.registerIconTheme(customIconTheme); context.subscriptions.push(disposable); } ``` 上面的代码定义了一个名为 `my-icon-theme` 的主题,其中定义了 `.myext` 文件类型图标。在 `activate` 方法中,我们使用 `registerIconTheme` 方法将该主题注册到 VS Code 中,并将返回值添加到扩展上下文的订阅列表中,以便在扩展卸载时取消注册

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值