如何在由快捷方式启动的程序中获取(.lnk)快捷方式文件路径?
我有一个打开* .postfix文件的c#程序。如何在由快捷方式启动的程序中获取(.lnk)快捷方式文件路径?
如果用户运行指向我的文件类型的(.lnk)快捷方式,我的程序将打开目标。因此,我的程序如何知道它是由(.lnk)快捷方式启动(并获取它的文件路径)?
在某些情况下,我需要替换.lnk文件。
谢谢!
编辑 首先,感谢那些回答我的问题的家伙。
按照@Anders的回答,我发现我的问题在这里。
我对Windows注册表做了一些修改,所以浏览器知道要把自定义的协议字符串放到某些程序中。
一些这样的事..
[InternetShortcut] URL = myProtocol:// ABCDEFG .....
这也许就是为什么我失去了lpTitle。 :(
我要试试这个方式: 每当我的程序调用时,当然用%1喂食,程序检查当前打开的资源管理器(Window),并尝试使用IWebBrowserApp获取它的当前路径。当然台式机,扫描和分析* .LNK确定更换哪一个。
我想,这可能会工作,但不能肯定。我会尽力。 继续
在本机代码中,如果STARTF_TITLEISLINKNAME
位设置为STARTUPINFO.dwFlags
,则可以拨打GetStartupInfo,那么.lnk的路径为STARTUPINFO.lpTitle
。我不知道是否有.NET方法来获取此信息,您可能需要P/Invoke ...
这给我带来了一点进一步。直到现在,我的输出中没有包含.lnk文件路径。无论如何,我应该多做点尝试。 – iuwei 2011-12-25 13:07:39
我的快捷方式内容是[InternetShortcut] URL = myProtocol:// ......我认为这会导致问题,lpTitle可能已被浏览器占用?也许不是。仍然尝试..谢谢你的谷歌http://www.catch22.net/tuts/undoc01 – iuwei 2011-12-25 13:44:59
.LNK的使用IShellLink接口,你在谈论IUniformResourceLocator,我不知道如果shell会通过你的路径以同样的方式... – Anders 2011-12-25 18:34:02
如果您使用Visual Studio安装项目来构建安装程序并执行文件类型关联,则应遵循以下说明:http://www.dreamincode.net/forums/topic/58005-file-associations-in-visual-studio/
- 在Visual Studio中打开您的解决方案。
- 添加安装项目到解决方案的文件,添加项目,新项目,安装和部署项目,安装项目
- 上安装项目在“解决方案资源管理器”窗口中单击鼠标右键,选择视图,然后选择文件类型。
你会看到在Visual studio.At显示“文件类型”窗口中的窗口的顶部将是“目标机器上的文件类型”
- “文件类型目标机上单击鼠标右键“。菜单将弹出添加”文件类型“点击此。
您会看到“新文档类型#1”已添加,并在其下方显示“&open”。
- 你想要的“新文档类型#1”可以是任何东西 - 它更改为描述性的。尽管用户从来没有看到这一点,但绝对不要使用通用的东西 - 尽可能唯一,因为你甚至可以在没有意识到的情况下覆盖当前的文件关联。例如,你可能认为“pngfile”可能是一个有用的名字 - 但现在使用它将所有“*。png”文件发送到您的应用程序,而不是图像查看器。一个好的做法可能是“YourCompantName.Filetype”,其中您的公司名称是您公司名称的名称,“Filetype”是描述性文字你的文件。
- 在你的新类型的“属性”窗口中,您将需要更改一些属性: 命令:切换到要run.If你点击应用程序的” ... “并且你会精确地找到并使用”主要输出...“文件 描述:这是对文件类型的描述(如果它没有描述它是自己的” 扩展:这是你的扩展名列表分别用“,” 分隔图标:这会将图标与您的文件类型关联起来,这会显示在窗口资源管理器中。
- 现在我们转到“&open”。这是一个可以在右击文件时使用的动作。默认动作(“&Open”当前设置为默认值)是双击点击“新文档类型#1”添加动作,但是暂时让我们定义我们的“开放”动作
点击“&Open”。您会在属性窗口中看到“Name” “参数”,“动词”。动词对用户是隐藏的,但它是存储在注册表中的关键字。将其与名称保持一致,但没有“&”。“参数”的默认值为“%1”,表示传递完整路径和文件名添加到您的应用程序中。如果您需要将标志传递给应用程序以执行特殊任务,那么您也可以在此添加其他内容。所有此infomaton都将通过命令行传递给您的应用程序,因此您需要熟悉“Environment.CommandLine”对象。
如果您需要设置不同的动作为默认,只需右键点击动作和“设置为默认”
基本上,你会通过的文件路径作为参数传递给你的程序。然后,如果它是一个控制台应用程序或Windows窗体,你应该检查的参数在Program.Main
static void Main(string[] args)
{
//if file association done with Arguments %1 as per forum post above
//you file path should be in args[0]
string filePath = null;
if(args != null && args.Length > 0)
filePath = args[0];
}
对于WPF应用程序,你需要处理的是,在启动事件为您的应用程序
void App_Startup(object sender, StartupEventArgs e)
{
string filePath = null;
if ((e.Args != null) && (e.Args.Length > 0))
{
filePath = e.Args[0];
}
}
您没有明白我的观点。 – iuwei 2011-12-25 03:30:51
Emmanuel,这是一篇非常有帮助而且写得很好的文章,但不幸的是,原创海报所寻找的不是什么。他们想知道我是否创建了一个新的程序快捷方式,然后点击该快捷方式,包含快捷方式的.lnk文件的名称是什么。 – 2011-12-25 03:44:05
我不确定这是可能的。 .LNK文件由资源管理器*打开,该信息用于产生该进程(例如CreateProcess)。我不知道如何/如何*过程(或如果一个LNK文件被参与)的信息开始可用... – 2011-12-25 02:21:24
将此标签重新标记为winapi - 希望某些大师能够提供更多彻底的答案。 – sq33G 2011-12-25 08:35:01