如何使自定义文件与应用程序关联?

huheng_0_0 2008-05-21 02:49:38
我现在有一个应用程序,他能将一些信息保存下来,生成一个自定义的问价,假设为.tlh文件
问题:如何实现双击这个自定义文件时,能lunch我的应用程序,(后面可以忽略)然后读取文件中的内容,然后显示?
...全文
55 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
ericzhangbo1982111 2008-05-22
  • 打赏
  • 举报
回复
解决没有
ericzhangbo1982111 2008-05-21
  • 打赏
  • 举报
回复
修改注册表
hkey_Classes_Root
下面新建一个.tlh的项
然后新建一个default的 value=tlh的键值

然后再现键一个tlh的项
然后在下面新建一个shell的项
然后在下面再新建一个open的项
然后在下面再新建一个command的项目
然后在下面新建一个defalut的键值 value=""\Program Files\TBS\PatchClient\你的应用程序.exe"" ""%%1""
这样你在运行点.tlh文件的时候会把路径传给应用程序.exe
从b.exe的 main(string[] args)里面取得

然后给你清洁工的代码........其实就你在程序打包的时候写进去就可以了

using Microsoft.Win32;
using System.Runtime.InteropServices;

[DllImport("shell32.dll")]
private static extern void SHChangeNotify(uint wEventId, uint uFlags,
IntPtr dwItem1, IntPtr dwItem2);
private const uint SHCNE_ASSOCCHANGED = 0x08000000;
private const uint SHCNF_IDLIST = 0x0000;
private const uint SHCNF_FLUSH = 0x1000;

private bool registryShell = false; // 是否关联文件

private void RegistryShell()
{
registryShell = true;
RegistryKey vRegistryKey = Registry.ClassesRoot.CreateSubKey(".xxx");
vRegistryKey.SetValue("", "xxx Document");
vRegistryKey = Registry.ClassesRoot.CreateSubKey(
@"xxx Document\shell\open\command",
RegistryKeyPermissionCheck.ReadWriteSubTree);
vRegistryKey.SetValue("", Application.ExecutablePath + " \"%1\"");
vRegistryKey = Registry.ClassesRoot.CreateSubKey(
@"xxx Document\DefaultIcon",
RegistryKeyPermissionCheck.ReadWriteSubTree);
vRegistryKey.SetValue("", Application.ExecutablePath + ",0");

SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST | SHCNF_FLUSH,
IntPtr.Zero, IntPtr.Zero);
}

private void UnregistryShell()
{
registryShell = false;
bool changeRegistry = false;
RegistryKey vRegistryKey = Registry.ClassesRoot.OpenSubKey(".xxx");
if (vRegistryKey != null)
{
changeRegistry = true;
vRegistryKey.Close();
Registry.ClassesRoot.DeleteSubKeyTree(".xxx");
}

vRegistryKey = Registry.ClassesRoot.OpenSubKey("xxx Document");
if (vRegistryKey != null)
{
changeRegistry = true;
vRegistryKey.Close();
Registry.ClassesRoot.DeleteSubKeyTree("xxx Document");
}
if (changeRegistry)
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST | SHCNF_FLUSH,
IntPtr.Zero, IntPtr.Zero);
}

private bool IsRegistryShell()
{
RegistryKey vRegistryKey = Registry.ClassesRoot.OpenSubKey(".xxx");
if (vRegistryKey == null) return false;
vRegistryKey = Registry.ClassesRoot.OpenSubKey(
@"xxx Document\shell\open\command");
if (vRegistryKey == null) return false;
if (vRegistryKey.GetValue("").ToString().ToLower() !=
Application.ExecutablePath.ToLower() + " \"%1\"") return false;
return true;
}


// 处理程序参数
private void Form1_Load(object sender, EventArgs e)
{
string[] vCommands = Environment.GetCommandLineArgs();
if (vCommands.Length > 1)
{
OpenDocument(vCommands[1]);
}
}

110,525

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧