【问题标题】:How to launch wifi network shortcut using C#如何使用 C# 启动 wifi 网络快捷方式
【发布时间】:2009-07-07 20:31:52
【问题描述】:

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

非常感谢任何帮助。

【问题讨论】:

  • 您的程序是否具有执行链接目标尝试执行的操作所需的权限?它可能看起来什么都不做,因为它没有做你想做的事的权限。例如,在 Vista 上,您需要先使用 UAC 提升您的权限,然后使用 UseShellExecute 启动快捷方式。
  • 我可以手动双击快捷方式并成功启动无线网络设置。
  • 好吧,这个想法就这么多。除非您进行了某种修改,否则 XP 不会阻止您做您想做的事情。

标签: c# wireless


【解决方案1】:

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

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

【讨论】:

  • 您是否在网络连接下为“无线网络连接”创建了快捷方式?它适用于可执行文件或文件的任何常规快捷方式。这似乎不适用于特殊的非基于文件的快捷方式。非常感谢任何帮助。
  • 我打开了我的网络连接,并将我的无线连接拖到了桌面。在那里,我将其重命名为“wifi”。顺便说一句,我没有运行 XP - 我运行的是 Win7 - 但我想不出任何应该产生任何影响的原因。
  • 在 Vista 下工作于文件和非文件快捷方式。
【解决方案2】:

是的,我已经确认这不适用于 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 文件是你唯一的朋友,似乎是布拉德曼。

【讨论】:

  • 感谢anonymousType。我尝试使用 ShellExecute,如下所示 ShellExecute(IntPtr.Zero, "open", myLnk, null, null, ShowCommands.SW_NORMAL) 这似乎不起作用,所以我更改了参数,如下所示 ShellExecute(IntPtr.零,“open”,“explorer”,myLnk,null,ShowCommands.SW_NORMAL)通过上面的调用,我得到一个安全警告,点击打开按钮成功打开对话框。不确定如何抑制警告对话框?非常感谢任何帮助。
【解决方案3】:

也许如果你用 shell 执行 .lnk?

使用rundll32?

【讨论】:

  • 我试过下面的代码,没有影响(不会显示无线网络设置对话框)
     System.Diagnostics.Process myProc = new System.Diagnostics.Process(); myProc.StartInfo.FileName = "rundll32.exe"; myProc.StartInfo.Arguments= "C\\Temp\\wifi.lnk"; myProc.Start(); 
    非常感谢任何帮助
【解决方案4】:
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 中提取信息?

【讨论】:

  • 为shortcut.TargetPath、shortcut.Arguments和shortcut.WorkingDirectory返回""
【解决方案5】:

如前所述,快捷方式的目标是一个 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”放到一个批处理文件中,然后从你的程序中启动它,但这绝对是一个杂项。

【讨论】:

  • 谢谢杰森。从命令提示符运行“start wifi.lnk”只能运行一次。关闭对话框并重试后,它不会再次显示无线网络设置对话框。我不确定为什么?我尝试使用 ShellExecute,如下所示 ShellExecute(IntPtr.Zero, "open", myLnk, null, null, ShowCommands.SW_NORMAL) 这似乎不起作用,所以我更改了参数,如下所示 ShellExecute(IntPtr.零,“open”,“explorer”,myLnk,null,ShowCommands.SW_NORMAL)通过上面的调用,我得到一个安全警告,点击打开按钮成功打开对话框。如何抑制警告
  • 啊,我很确定您不能禁用该安全警告。由于您使用资源管理器打开它,因此您不得不依赖资源管理器的安全机制,该机制在某些情况下会在打开随机快捷方式之前提示用户。如果您可以覆盖警告,那它就不是什么安全屏障了是吗? ;) 批处理文件并不是一个真正糟糕的方法。您可以将代码保留在程序中,将其写入临时文件,然后使用 ProcessStartInfo.WindowStyle 属性隐藏生成的命令窗口。仍然是一个杂物,但它会是透明的,不是吗?
  • 另外,我不确定为什么命令提示符下的start wifi.lnk 只为您工作一次。我可以一遍又一遍地做......没有任何困难。
  • 如果无线网络已连接,在命令提示符下使用“start wifi.lnk”似乎只能工作一次。你能检查一下你的情况是否属实吗?
猜你喜欢
  • 2018-01-09
  • 2016-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-23
  • 1970-01-01
  • 2015-05-09
  • 1970-01-01
相关资源
最近更新 更多