我在C:\ Temp文件夹中为Wifi网络连接创建了一个快捷方式(特殊类型的快捷方式)
我正在尝试使用C#
启动它System.Diagnostics.Process myProc = new System.Diagnostics.Process(); myProc.StartInfo.FileName = "C:\\Temp\\wifi.lnk"; myProc.Start();
当我运行上面的代码时,没有真正发生的事情。当我设置“UseShellExecutable = False”和“RedirectStandardError = True”时,我收到一个异常,说“指定的可执行文件不是有效的Win32应用程序”
我试图通过pinvoking“FindExecutable()”方法找到可执行文件,但它返回空字符串。
非常感谢任何帮助。
答案 0 :(得分:1)
你错过了路径中的冒号。我在桌面上创建了快捷方式,然后运行以下内容,它按预期工作...
System.Diagnostics.Process myProc = new System.Diagnostics.Process();
myProc.StartInfo.FileName = @"C:\Users\scott\Desktop\wifi.lnk";
myProc.Start();
答案 1 :(得分:1)
是的,我已经确认这对WinXP不起作用。 如果检查lnk文件的快捷方式选项卡,您会发现targettype实际上是GUID(映射到指定网卡的guid)。
我的猜测是,在XP下使用process.start时,shell没有正确处理必要的guid转换。 您可能必须尝试以不同的方式在XP下启动快捷方式,例如使用Win32 com interop调用来启动快捷方式。查看pinvoke网站的功能标题。
编辑: 实际上我没有引用FindExecutable签名,我是指的 http://www.pinvoke.net/default.aspx/shell32.ShellExecute
也尝试了cmd.exe / k,但也无效。 pinvoke或.bat文件是你唯一的朋友,看起来像是bradman。
答案 2 :(得分:0)
也许如果你shell执行.lnk?
使用rundll32?
答案 3 :(得分:0)
using System;
// add a reference to the com component
// "Windows Script Host Object Model" for IWshRuntimeLibrary
using IWshRuntimeLibrary;
namespace ConsoleApplicationCSharp
{
public class Foo
{
public static void Main(string[] args)
{
string pathLnk = @"C:\Users\scott\Desktop\wifi.lnk";
WshShell shell = new WshShell();
IWshShortcut shortcut = (IWshShortcut)shell.CreateShortcut(pathLnk);
Console.WriteLine("target path: " + shortcut.TargetPath);
Console.WriteLine("argument: " + shortcut.Arguments);
Console.WriteLine("working dir: " + shortcut.WorkingDirectory);
return;
}
}
}
此代码是否能够从wifi.lnk中提取信息?
答案 4 :(得分:0)
如前所述,快捷方式的目标是GUID,因此FindExecutable将无法提供帮助,但如果您感兴趣,这里是它的签名:
[DllImport("shell32.dll")]
static extern IntPtr FindExecutable(string file, string directory, [Out] StringBuilder result);
有趣的是,运行“start wifi.lnk”可以在命令提示符下运行,但这不会:
class Program
{
static void Main(string[] args)
{
Process p = new Process();
p.StartInfo.Arguments = "/c start wifi.lnk";
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.WorkingDirectory = @"C:\Documents and Settings\Administrator\Desktop";
p.Start();
}
}
任何人都想冒险猜测为什么?
如果你真的,真的,真的需要这个工作,你可以将“启动wifi.lnk”放入批处理文件并从你的程序启动它,但它绝对是一个kludge。