我在 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 应用程序”
我尝试通过调用“FindExecutable()”方法来查找可执行文件,但它返回空字符串。
非常感谢任何帮助。
您的路径中缺少一个冒号。我在桌面上创建了快捷方式,然后运行以下命令,它按预期工作......
System.Diagnostics.Process myProc = new System.Diagnostics.Process();
myProc.StartInfo.FileName = @"C:\Users\scott\Desktop\wifi.lnk";
myProc.Start();
是的,我已经确认这在 WinXP 上不起作用。 如果你检查lnk文件的快捷方式选项卡,你会发现targettype实际上是一个GUID(映射到指定网卡的guid)。
我的猜测是,当在 XP 下使用 process.start 时,shell 没有正确处理必要的 guid 转换。 您可能必须尝试在 XP 下启动快捷方式的不同方式,例如使用 Win32 com 互操作调用来启动快捷方式。查看 pinvoke 网站以获取函数头。
编辑: 实际上我不是指 FindExecutable 签名,我指的是 http://www.pinvoke.net/default.aspx/shell32.ShellExecute
还尝试了 cmd.exe /k 但也不起作用。 布拉德曼看来,pinvoke 或 .bat 文件是你唯一的朋友。
也许你可以通过 shell 执行 .lnk?
使用rundll32?
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中提取信息吗?
如前所述,快捷方式的目标是 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();
}
}
有人想大胆猜测一下为什么吗?
如果你真的、真的、真的需要这个工作,你可以将“start wifi.lnk”放入一个批处理文件中,然后从你的程序中启动它,但这绝对是一个拼凑。