自定义文件双击打开事件

原创 2013年12月04日 16:07:32

自定文件双击打开事件,需要在注册表中注册文件的图标,文件打开的启动软件路径。

首先,注册表中添加描述、图标、启动软件路径

代码如下:为操作注册表的事件

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Win32;
namespace UltraUV
{
    class CFileTypeRegister
    {
        /// <summary>
        /// RegisterFileType 使文件类型与对应的图标及应用程序关联起来。
        /// </summary>        
        public static void RegisterFileType(CFileTypeRegInfo regInfo)
        {
            string strFileType = regInfo.strExtendName; 
            string strDescription = regInfo.strDescription; 
            string strIconPath = regInfo.strIcoPath;
            string strOpenExe = regInfo.strExePath;


            // 注册表顶级节点
            RegistryKey hkRoot = Registry.ClassesRoot;


            // 在HKEY_CLASSES_ROOT目录下创建文件类型
            if (!strFileType.StartsWith("."))
            {
                strFileType = "." + strFileType;
            }


            if (null == hkRoot.OpenSubKey(strFileType))
            {
            }
            else
            {
#if DEBUG
                // 调试期间由于反复更换目录,暂时每次都先删除\
                hkRoot.DeleteSubKeyTree(strFileType);
#endif
            }


            // 注册表中尚未关联指定的文件类型,注册文件类型并进行关联
            RegistryKey pgID = hkRoot.CreateSubKey(strFileType);
            if (pgID == null)
            {
                // 注册表操作关闭
                hkRoot.Close();
                throw new Exception("Failed when creating progID");
            }
            // 文件类型描述
            pgID.SetValue("", strDescription, RegistryValueKind.String);


            // 关联图标
            RegistryKey defaultIcon = pgID.CreateSubKey("DefaultIcon");
            if (defaultIcon == null)
            {
                // 逐级关闭注册表
                pgID.Close();
                hkRoot.Close();
                throw new Exception("Failed when creating icon");
            }
            // 设定图标
            defaultIcon.SetValue("", strIconPath, RegistryValueKind.String);
            defaultIcon.Close();


            // 关联相关动作
            // 创建shell子键
            RegistryKey shell = pgID.CreateSubKey("shell");
            if (shell == null)
            {
                // 逐级关闭注册表
                pgID.Close();
                hkRoot.Close();
                throw new Exception("Failed when creating shell key");
            }
            // 创建打开子键
            RegistryKey open = shell.CreateSubKey("open");
            if (open == null)
            {
                // 逐级关闭注册表
                shell.Close();
                pgID.Close();
                hkRoot.Close();
                throw new Exception("Failed when creating shell-open key");
            }
            // 创建打开子键
            RegistryKey command = open.CreateSubKey("command");
            if (command == null)
            {
                // 逐级关闭注册表
                open.Close();
                shell.Close();
                pgID.Close();
                hkRoot.Close();
                throw new Exception("Failed when creating shell-open-command key");
            }
            // 设定打开程序
            command.SetValue("", "\"" + strOpenExe + "\" \"%1\"", RegistryValueKind.String);
            // 逐级关闭注册表
            command.Close();
            open.Close();
            shell.Close();
            pgID.Close();


            hkRoot.Close();
        }


        /**/
        /// <summary>
        /// GetFileTypeRegInfo 得到指定文件类型关联信息
        /// </summary>        
        public static CFileTypeRegInfo GetFileTypeRegInfo(string extendName)
        {
            if (!CFileTypeRegister.FileTypeRegistered(extendName))
            {
                return null;
            }


            CFileTypeRegInfo cRegInfo = new CFileTypeRegInfo(extendName);


            string strRelationName = extendName.Substring(1, extendName.Length - 1).ToUpper() + "_FileType";
            RegistryKey cRelationKey = Registry.ClassesRoot.OpenSubKey(strRelationName);
            cRegInfo.strDescription = cRelationKey.GetValue("").ToString();


            RegistryKey cIconKey = cRelationKey.OpenSubKey("DefaultIcon");
            cRegInfo.strIcoPath = cIconKey.GetValue("").ToString();


            RegistryKey cShellKey = cRelationKey.OpenSubKey("Shell");
            RegistryKey cOpenKey = cShellKey.OpenSubKey("Open");
            RegistryKey cCommandKey = cOpenKey.OpenSubKey("Command");
            string strTemp = cCommandKey.GetValue("").ToString();
            cRegInfo.strExePath = strTemp.Substring(0, strTemp.Length - 3);


            return cRegInfo;
        }


        /**/
        /// <summary>
        /// UpdateFileTypeRegInfo 更新指定文件类型关联信息
        /// </summary>    
        public static bool UpdateFileTypeRegInfo(CFileTypeRegInfo regInfo)
        {
            if (!CFileTypeRegister.FileTypeRegistered(regInfo.strExtendName))
            {
                return false;
            }




            string strExtendName = regInfo.strExtendName;
            string strRelationName = strExtendName.Substring(1, strExtendName.Length - 1).ToUpper() + "_FileType";
            RegistryKey cRelationKey = Registry.ClassesRoot.OpenSubKey(strRelationName, true);
            cRelationKey.SetValue("", regInfo.strDescription);


            RegistryKey cIconKey = cRelationKey.OpenSubKey("DefaultIcon", true);
            cIconKey.SetValue("", regInfo.strIcoPath);


            RegistryKey cShellKey = cRelationKey.OpenSubKey("Shell");
            RegistryKey cOpenKey = cShellKey.OpenSubKey("Open");
            RegistryKey cCommandKey = cOpenKey.OpenSubKey("Command", true);
            cCommandKey.SetValue("", regInfo.strExePath + " %1");
            cRelationKey.Close();
            return true;
        }


        /**/
        /// <summary>
        /// FileTypeRegistered 指定文件类型是否已经注册
        /// </summary>        
        public static bool FileTypeRegistered(string extendName)
        {
            RegistryKey cSoftwareKey = Registry.ClassesRoot.OpenSubKey(extendName);
            if (cSoftwareKey != null)
            {
                return true;//暂时改为false,还要改为true
            }
            return false;
        }
    }
}

其次调用,注册表的操作事件,注册注册表

m_cFileTypeRegInfo.strExtendName = ".sdf";
m_cFileTypeRegInfo.strDescription = Properties.Resource.STR_SDF_NAME_METHODFILE;
m_cFileTypeRegInfo.strIcoPath = Application.StartupPath + "\\sharedDLL.dll,0"; //图标在dll文件中的位置,0表示第一个图标。
m_cFileTypeRegInfo.strExePath = Application.ExecutablePath;
CFileTypeRegister.RegisterFileType(m_cFileTypeRegInfo);

图标的排序是按照图标在资源文件的顺序排列的,如下图,0号图标就为UltraUV Project.ico.ico。


为了注册完成后,自定义文件的图标能够及时更新,使用API函数实现,在注册完后调用SHChangeNotify()函数,更新图标。

 [System.Runtime.InteropServices.DllImport("shell32.dll")]
public static extern void SHChangeNotify(uint wEventId, uint uFlags, IntPtr dwItem1, IntPtr dwItem2);

SHChangeNotify(0x8000000, 0, IntPtr.Zero, IntPtr.Zero);

为了能够找到图标的位置,还需要设置项目中资源文件路径:

项目-->属性-->应用程序-->资源文件



点击图片触发上传文件事件

上传图片并显示 上传文件 function upoadFile(obj) { $("#"obj)....
  • sunshineboy_oO
  • sunshineboy_oO
  • 2016年08月25日 14:41
  • 2501

win7中VC6.0 visual C++6.0无法打开文件和向工程中添加文件的解决办法

一、彻底解决兼容问题:Windows 7下载安装 Visual C++ 6.0(VC6) 全程图解 网上成千上万的诸如 “有没有Win7兼容的VC6的下载”、“Win7下Visual C++ 6.0...
  • xglhw1987
  • xglhw1987
  • 2014年11月01日 13:59
  • 2952

VC6添加或打开文件崩溃的解决方法

这个问题其实有人已经给出了很详细的解决方法,但是需要下载一个filetool插件。 方法一: 这里我先给个简单的添加文件的方法,就是修改工程目录下面的dsp文件。dsp全称是DeveloperSt...
  • qq229596421
  • qq229596421
  • 2016年10月10日 19:09
  • 1515

文件关联后vb.net 软件如何响应被关联文件的双击事件

Windows系统很早就加入了文件关联的功能,它大大增加了日常使用操作系统的便利性。所谓的文件关联就是指系统把指定扩展名的文件自动关联到相应的应用程序,比如.doc文件默认情况下就自动和Microso...
  • wang19850219
  • wang19850219
  • 2014年12月04日 15:44
  • 777

win7 32位 中VC6.0 visual C++6.0无法打开文件和 向工程中添加文件的解决办法

把FileTool.dll文件拷贝至 C:\Program Files\Microsoft Visual Studio\Common\MSDev98\AddIns 文件夹下在cmd下手动注册该dll ...
  • bmjhappy
  • bmjhappy
  • 2016年11月16日 13:10
  • 901

fragment按钮响应事件

如何在fragment中为按钮添加响应事件fragment_content.xml:
  • u010778159
  • u010778159
  • 2015年04月28日 11:31
  • 1666

vc6.0 打开文件 添加文件到工程 崩溃的问题

崩溃的原因查了一下,应该是visio
  • leo1949asd
  • leo1949asd
  • 2014年11月11日 19:54
  • 1510

iOS将本应用添加在‘其他方式打开’的列表中

如图中拉帮结伙,让自己的应用出现在列表中的方法如下:一、在本应用中点击TARGETS –>Info—>Document types 如图: 《1》图中name可以自定义,types可选填入 《2...
  • dream9393
  • dream9393
  • 2017年02月21日 12:45
  • 1384

C++监听文件夹下的添加、修改、删除文件事件

#include #include #include #include using namespace std;void fileWatcher();int main() { fileW...
  • zx3517288
  • zx3517288
  • 2015年09月12日 10:47
  • 974

iOS App让自己的应用在其他应用中打开列表中显示

像百度网盘等应用,都有
  • totogo2010
  • totogo2010
  • 2014年06月07日 12:00
  • 24556
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:自定义文件双击打开事件
举报原因:
原因补充:

(最多只允许输入30个字)