如何使用C#启动wifi网络快捷方式

问题描述 投票:0回答:5

我在 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()”方法来查找可执行文件,但它返回空字符串。

非常感谢任何帮助。

c# wifi
5个回答
1
投票

您的路径中缺少一个冒号。我在桌面上创建了快捷方式,然后运行以下命令,它按预期工作......

System.Diagnostics.Process myProc = new System.Diagnostics.Process();
myProc.StartInfo.FileName = @"C:\Users\scott\Desktop\wifi.lnk";
myProc.Start();

1
投票

是的,我已经确认这在 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 文件是你唯一的朋友。


0
投票

也许你可以通过 shell 执行 .lnk?

使用rundll32?


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中提取信息吗?


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();
    }
}

有人想大胆猜测一下为什么吗?

如果你真的、真的、真的需要这个工作,你可以将“start wifi.lnk”放入一个批处理文件中,然后从你的程序中启动它,但这绝对是一个拼凑。

© www.soinside.com 2019 - 2024. All rights reserved.