2011-12-25 106 views
1

我有一个打开* .postfix文件的c#程序。如何在由快捷方式启动的程序中获取(.lnk)快捷方式文件路径?

如果用户运行指向我的文件类型的(.lnk)快捷方式,我的程序将打开目标。因此,我的程序如何知道它是由(.lnk)快捷方式启动(并获取它的文件路径)?

在某些情况下,我需要替换.lnk文件。

谢谢!

编辑 首先,感谢那些回答我的问题的家伙。

按照@Anders的回答,我发现我的问题在这里。

我对Windows注册表做了一些修改,所以浏览器知道要把自定义的协议字符串放到某些程序中。

一些这样的事..

[InternetShortcut] URL = myProtocol:// ABCDEFG .....

这也许就是为什么我失去了lpTitle。 :(

我要试试这个方式: 每当我的程序调用时,当然用%1喂食,程序检查当前打开的资源管理器(Window),并尝试使用IWebBrowserApp获取它的当前路径。当然台式机,扫描和分析* .LNK确定更换哪一个。

我想,这可能会工作,但不能肯定。我会尽力。 继续

+1

我不确定这是可能的。 .LNK文件由资源管理器*打开,该信息用于产生该进程(例如CreateProcess)。我不知道如何/如何*过程(或如果一个LNK文件被参与)的信息开始可用... – 2011-12-25 02:21:24

+1

将此标签重新标记为winapi - 希望某些大师能够提供更多彻底的答案。 – sq33G 2011-12-25 08:35:01

回答

3

在本机代码中,如果STARTF_TITLEISLINKNAME位设置为STARTUPINFO.dwFlags,则可以拨打GetStartupInfo,那么.lnk的路径为STARTUPINFO.lpTitle。我不知道是否有.NET方法来获取此信息,您可能需要P/Invoke ...

+0

这给我带来了一点进一步。直到现在,我的输出中没有包含.lnk文件路径。无论如何,我应该多做点尝试。 – iuwei 2011-12-25 13:07:39

+0

我的快捷方式内容是[InternetShortcut] URL = myProtocol:// ......我认为这会导致问题,lpTitle可能已被浏览器占用?也许不是。仍然尝试..谢谢你的谷歌http://www.catch22.net/tuts/undoc01 – iuwei 2011-12-25 13:44:59

+0

.LNK的使用IShellLink接口,你在谈论IUniformResourceLocator,我不知道如果shell会通过你的路径以同样的方式... – Anders 2011-12-25 18:34:02

3

你不知道。有没有办法做到这一点结束的故事

+0

可以实现钩子吗? – iuwei 2011-12-25 02:42:22

+0

仅在用户激活快捷方式之前运行,并且准备将答案放在磁盘以外的其他位置。 – Joshua 2011-12-25 04:07:05

+0

我有一个服务在终端上运行。我需要知道有多少种方法可以做到这一点。钩必须是最后一个选项,我不熟悉钩(特别是这样做)。任何人都可以在这里留下链接或适当的搜索关键字? THK。 – iuwei 2011-12-25 06:55:50

0

如果您使用Visual Studio安装项目来构建安装程序并执行文件类型关联,则应遵循以下说明:http://www.dreamincode.net/forums/topic/58005-file-associations-in-visual-studio/

  1. 在Visual Studio中打开您的解决方案。

  2. 添加安装项目到解决方案的文件,添加项目,新项目,安装和部署项目,安装项目

  3. 上安装项目在“解决方案资源管理器”窗口中单击鼠标右键,选择视图,然后选择文件类型。

    你会看到在Visual studio.At显示“文件类型”窗口中的窗口的顶部将是“目标机器上的文件类型”

  4. “文件类型目标机上单击鼠标右键“。菜单将弹出添加”文件类型“点击此。

    您会看到“新文档类型#1”已添加,并在其下方显示“&open”。

  5. 你想要的“新文档类型#1”可以是任何东西 - 它更改为描述性的。尽管用户从来没有看到这一点,但绝对不要使用通用的东西 - 尽可能唯一,因为你甚至可以在没有意识到的情况下覆盖当前的文件关联。例如,你可能认为“pngfile”可能是一个有用的名字 - 但现在使用它将所有“*。png”文件发送到您的应用程序,而不是图像查看器。一个好的做法可能是“YourCompantName.Filetype”,其中您的公司名称是您公司名称的名称,“Filetype”是描述性文字你的文件。

  6. 在你的新类型的“属性”窗口中,您将需要更改一些属性: 命令:切换到要run.If你点击应用程序的” ... “并且你会精确地找到并使用”主要输出...“文件 描述:这是对文件类型的描述(如果它没有描述它是自己的” 扩展:这是你的扩展名列表分别用“,” 分隔图标:这会将图标与您的文件类型关联起来,这会显示在窗口资源管理器中。

  7. 现在我们转到“&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]; 
    } 
} 
 
+0

您没有明白我的观点。 – iuwei 2011-12-25 03:30:51

+0

Emmanuel,这是一篇非常有帮助而且写得很好的文章,但不幸的是,原创海报所寻找的不是什么。他们想知道我是否创建了一个新的程序快捷方式,然后点击该快捷方式,包含快捷方式的.lnk文件的名称是什么。 – 2011-12-25 03:44:05