首页 > 编程语言 >c#中用System.Diagnostics.Process.Start(Path.GetFullPath(“vlc.exe.lnk“), url);用vlc的快捷方式打开http的url不起作用?

c#中用System.Diagnostics.Process.Start(Path.GetFullPath(“vlc.exe.lnk“), url);用vlc的快捷方式打开http的url不起作用?

时间:2023-05-24 20:02:25浏览次数:60  
标签:exe GetFullPath url vlc lnk Path 快捷方式

vlc.exe.lnk双击这个文件,能正常打开vlc,但是用System.Diagnostics.Process.Start(Path.GetFullPath("vlc.exe.lnk"), url);没有任何反应。根据常理,不应该出现这个问题。但是现实就是这么魔幻,偏偏有这个问题。

c#中用System.Diagnostics.Process.Start(Path.GetFullPath(“vlc.exe.lnk“), url);用vlc的快捷方式打开http的url不起作用?_快捷方式

根据上面图,根据快捷方式是可以获取到vlc可执行文件的路径的,然后在网上搜索到这段代码,如下:

// 引用→添加引用→左侧菜单的 COM 选项→勾上 Microsoft Shell Controls And Automation
using Shell32;
namespace FD.WinformUI
{
    public class UICommon
    {
        // 传入快捷方式文件的路径,返回目标 exe 文件的路径
        public string GetExePathFromShortcut(string shortcutFilePath)
        {
            FileInfo fileInfo = new FileInfo(shortcutFilePath);
            string targetPath = "";
            if (fileInfo.Extension.ToLower() == ".lnk") // 判断是否为快捷方式文件
            {
                Shell shell = new Shell();
                Folder folder = shell.NameSpace(fileInfo.DirectoryName);
                FolderItem folderItem = folder.ParseName(fileInfo.Name);
                if (folderItem != null)
                {
                    ShellLinkObject link = (ShellLinkObject)folderItem.GetLink;
                    targetPath = link.Target.Path; // 获取目标 exe 文件的路径
                }
            }
            else if (fileInfo.Extension.ToLower() == ".url") // 判断是否为网址快捷方式
            {
                using (StreamReader reader = new StreamReader(shortcutFilePath))
                {
                    string line;
                    while ((line = reader.ReadLine()) != null)
                    {
                        if (line.StartsWith("URL=", StringComparison.OrdinalIgnoreCase))
                        {
                            targetPath = line.Substring(4).Trim();
                            break;
                        }
                    }
                }
            }
            return targetPath;
        }
    }
}

调用上面的函数UICommon.Instance.GetExePathFromShortcut(Path.GetFullPath("vlc.exe.lnk")),得到的路径是 "C:\Program Files (x86)\VideoLAN\VLC\vlc.exe" ,而这个路径根本不存在,这应该是c#画蛇添足了,要去掉" (x86)"。用System.Diagnostics.Process.Start(@"C:\Program Files (x86)\VideoLAN\VLC\vlc.exe", url);这样就能调用了,算是解决了这个问题。

后来我尝试用System.Diagnostics.Process.Start(UICommon.Instance.GetExePathFromShortcut(Path.GetFullPath("vlc.exe.lnk")), url);结果又傻眼了,发现调用了这个函数,vlc根本无法启动。后来打印日志,发现日志卡住了,这意思就是程序卡住了。后来干脆在项目的主函数里调用System.Diagnostics.Process.Start(UICommon.Instance.GetExePathFromShortcut(Path.GetFullPath("vlc.exe.lnk")), url);结果vlc能启动,并且能正常打开http的url。

在主函数里可以,在项目的其他代码里不行,这非常奇怪。后来发现项目的其他代码里新开启了线程,怀疑是线程的问题。因此我在主函数里开启线程,然后在线程里调用System.Diagnostics.Process.Start(UICommon.Instance.GetExePathFromShortcut(Path.GetFullPath("vlc.exe.lnk")), url);测试结果是vlc无法启动。

这充分证明了我的猜想,UICommon.Instance.GetExePathFromShortcut(Path.GetFullPath("vlc.exe.lnk")这个方法只能在主线程里运行,在其他线程里无法运行。我在chatgpt里问了下,chatgpt回复的如下:

1.该方法需要在主线程中执行。因为 Shell32 命名空间对应的 COM 组件在内部使用了单线程模型(Single-Threaded Apartment, STA),必须在 UI 线程中执行,否则会抛出异常。

2.如果你想在新线程中调用该方法,可以考虑将该方法封装到一个带有返回值的委托中,并使用 Control.Invoke() 或者 Control.BeginInvoke() 方法将其运行在 UI 线程中。

最终的解决方案,不用根据快捷方式获取程序路径,在调用System.Diagnostics.Process.Start(Path.GetFullPath("vlc.exe.lnk"), url)之前,先判断"C:\Program Files (x86)\VideoLAN\VLC\vlc.exe"和"C:\Program Files\VideoLAN\VLC\vlc.exe"是否存在。如果存在,就直接用已经存在的vlc路径;如果不存在,就用"vlc.exe.lnk"这个快捷方式。

标签:exe,GetFullPath,url,vlc,lnk,Path,快捷方式
From: https://blog.51cto.com/moonfdd/6342808

相关文章

  • c#中用System.Diagnostics.Process.Start(Path.GetFullPath(“vlc.exe.lnk“), url);用
    vlc.exe.lnk双击这个文件,能正常打开vlc,但是用System.Diagnostics.Process.Start(Path.GetFullPath("vlc.exe.lnk"),url);没有任何反应。根据常理,不应该出现这个问题。但是现实就是这么魔幻,偏偏有这个问题。根据上面图,根据快捷方式是可以获取到vlc可执行文件的路径的,然后在网上......
  • curl命令技巧备忘
    curl简介curl[options/URLs]curl是一种利用URL语法用于服务器传输数据的工具,支持如下协议:DICTFILEFTP\FTPSGOPHERHTTP\HTTPSIMAP\IMAPSLDAP\LDAPSPOP3\POP3SRTMP\RTSPSCPSFTPSMB\SMBSSMTP\SMTPSTELNETTFTP还支持POST、cookies、认证、从指定偏移处下载部分文件......
  • Rails:从URL解析路由信息
    ###在Rails3中,您可以执行以下操作:Rails.application.routes.recognize_path"/accounts/1"#{:action=>"show",:controller=>"accounts",:id=>"1"}ActionController::Routing::Routes.recognize_path("/accounts/1&q......
  • 网页的快捷方式打开自动全屏--Chrome、Firefox 浏览器相关设置
    Firefox的全屏方式与Chrome不同,Chrome自带全屏模式以及APP模式,通过简单的参数即可设置,而Firefox暂时么有这个功能,Firefox的全屏功能可以通过全屏插件实现。全屏模式下,按F11不会退出全屏,鼠标移动到屏幕上方也不会提示退出全屏如果当前运行着其它的Chrome窗口,那么全屏化......
  • python 问题修复ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1+
    目录python问题修复ImportError:urllib3v2.0onlysupportsOpenSSL1.1.1+升级openssl版本降低urllib版本python问题修复ImportError:urllib3v2.0onlysupportsOpenSSL1.1.1+这个问题时python版本安装的urllib3版本过高,而openssl版本太低导致的解决无非两种方法,降低......
  • CURL命令
    1.概述工作中排查线上问题时,会经常调用问题接口,使用postman太笨重了,且客户不一定能安装这类软件,因此此处记录下使用curl命令调用接口,curl命令调用接口不复杂,记录于此是为了自己找的方便2.请求postbodycurl-XPOSThttp://ip:port/hello/hello.action-H'Content-Type:app......
  • iOS应用通过地址(URL)安装
    目标:iOS应用通过URL地址来安装准备:1.bundleidentifier2.应用图标3.下载地址  完整的下载地址是itms-services://?action=download-manifest&url=https://www.yourdomain.cn/download/2.1.0-10637/test.116d7.56d82df.20170122.test.domain.cn.ipa.plist其中,配置test.116d7.56d8......
  • HttpUrlConnection底层实现和关于java host绑定ip即时生效的设置及分析
     最近有个需求需要对于获取URL页面进行host绑定并且立即生效,在java里面实现可以用代理服务器来实现:因为在测试环境下可能需要通过绑定来访问测试环境的应用实现代码如下: publicstaticStringgetResponseText(StringqueryUrl,Stringhost,Stringip){//queryUrl,完整的u......
  • Day 41 41.3 URL 解码 编码详解
    【一】URL解码/编码详解当URL路径或者查询参数中,带有中文或者特殊字符的时候,就需要对URL进行编码(采用十六进制编码格式)。URL编码的原则是使用安全字符去表示那些不安全的字符。安全字符,指的是没有特殊用途或者特殊意义的字符。【二】URL基本组成URL是由一些简单的......
  • 整理:各个浏览器及web服务器对URL(get)长度的限制
     http1.1协议中对url的长度是不受限制的:TheHTTPprotocoldoesnotplaceanyapriorilimitonthelengthofaURI.ServersMUSTbeabletohandletheURIofanyresourcetheyserve,andSHOULDbeabletohandleURIsofunboundedlengthiftheyprovideGET-......