2009-07-07 8 views
3

J'ai créé un raccourci dans le dossier C: \ Temp pour la connexion réseau Wifi (type spécial de coupe courte)Comment lancer raccourci réseau wifi en utilisant C#

Je suis en train de lancer ce en utilisant C#

 

System.Diagnostics.Process myProc = new System.Diagnostics.Process(); 
myProc.StartInfo.FileName = "C:\\Temp\\wifi.lnk"; 
myProc.Start(); 

Lorsque je cours le code ci-dessus, rien ne se passe vraiment. lorsque je mets les "UseShellExecutable = False" et "RedirectStandardError = True", j'obtiens une exception disant "L'exécutable spécifié n'est pas une application Win32 valide"

J'ai essayé de trouver l'exécutable en pinçant le "FindExecutable" () "méthode, mais elle renvoie une chaîne vide.

Toute aide est grandement appréciée. Peut-être que si vous exécutez shell .lnk?

+0

Votre programme dispose-t-il des autorisations nécessaires pour effectuer ce que la cible du lien essaie de faire? Il peut sembler ne rien faire parce qu'il n'a pas les permissions de faire ce que vous voulez.Par exemple, sur Vista, vous devez d'abord élever vos autorisations avec l'UAC, puis lancer le raccourci à l'aide de UseShellExecute. – jasonh

+0

Je peux double-cliquer sur le raccourci manuellement et lancer les paramètres réseau sans fil avec succès. –

+0

Je suis sous Windows XP Pro. –

Répondre

0

Utilisez rundll32?

+0

J'ai essayé le code suivant, sans impact (n'affiche pas la boîte de dialogue des paramètres réseau sans fil)

 System.Diagnostics.Process myProc = new System.Diagnostics.Process(); myProc.StartInfo.FileName = "rundll32.exe"; myProc.StartInfo.Arguments= "C\\Temp\\wifi.lnk"; myProc.Start(); 
Toute aide est grandement appréciée –

1

Il vous manque un deux-points dans votre chemin. J'ai créé le raccourci sur mon bureau, puis couru ce qui suit, et cela a fonctionné comme prévu ...

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

Avez-vous créé un raccourci pour "Connexion réseau sans fil" sous Connexions réseau? Cela fonctionne très bien avec tous les raccourcis habituels pour un exécutable OU pour un fichier. Cela ne semble pas fonctionner raccourcis spéciaux non basés sur des fichiers. Toute aide est grandement appréciée. –

+0

J'ai ouvert mes connexions réseau et j'ai déplacé ma connexion sans fil vers le bureau. Une fois là, je l'ai renommé en "wifi". En passant, je ne cours pas XP - je cours Win7 - mais je ne peux pas penser à une raison qui devrait faire une différence. –

+0

Fonctionne sous Vista à la fois pour les fichiers et les raccourcis sans fichier. –

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; 

    } 
    } 
} 

Est-ce code capable d'extraire les informations de votre wifi.lnk?

+0

renvoie «» pour raccourci.TargetPath, raccourci.Arguments et raccourci.WorkingDirectory –

1

Oui, j'ai confirmé que cela ne fonctionne pas sur WinXP. Si vous cochez l'onglet de raccourci du fichier lnk, vous constaterez que le targettype est en fait un GUID (qui correspond au guid de la carte réseau spécifiée). Je suppose que la traduction de guid nécessaire n'est pas gérée correctement par le shell lorsque process.start est utilisé sous Windows XP. Vous devrez peut-être essayer une autre façon de démarrer le raccourci sous XP, par exemple en utilisant un appel Win32 com interop pour démarrer le raccourci. consultez le site Web de pinvoke pour l'en-tête de fonction.

Edit: En fait, je ne référenceurs à la signature FindExecutable, je faisais allusion à http://www.pinvoke.net/default.aspx/shell32.ShellExecute

aussi essayé cmd.exe/k et cela ne fonctionne pas non plus. pinvoke ou fichier .bat sont vos seuls amis, il semble bradman.

+0

Merci anonymousType. J'ai essayé d'utiliser ShellExecute comme indiqué ci-dessous ShellExecute (IntPtr.Zero, "ouvert", myLnk, null, null, ShowCommands.SW_NORMAL) Cela ne semble pas fonctionner, J'ai donc changé les paramètres comme indiqué ci-dessous ShellExecute (IntPtr .Zero, "ouvrir", "explorer", myLnk, null, ShowCommands.SW_NORMAL) Avec l'appel ci-dessus, je reçois un avertissement de sécurité, cliquez sur le bouton Ouvrir ouvre la boîte de dialogue avec succès. Vous ne savez pas comment supprimer le dialogue d'avertissement? Toute aide est grandement appréciée. –

0

Comme mentionné précédemment, la cible du raccourci est un GUID, donc FindExecutable ne sera pas en mesure d'aider, mais voici la signature si vous êtes intéressé:

[DllImport("shell32.dll")] 
    static extern IntPtr FindExecutable(string file, string directory, [Out] StringBuilder result); 

Fait intéressant, en cours d'exécution " commencer wifi.lnk » fonctionne à partir d'une invite de commande, mais cela ne veut pas:

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

Quelqu'un veut avancer une hypothèse pour expliquer pourquoi? Si vous avez vraiment vraiment besoin de ce fonctionnement, vous pouvez mettre le "start wifi.lnk" dans un fichier batch et le lancer à partir de votre programme, mais c'est définitivement un "kludge".

+0

Merci jasonh. en cours d'exécution "start wifi.lnk" à partir de l'invite de commande fonctionne seulement une fois. Une fois que vous avez fermé la boîte de dialogue et réessayez, la boîte de dialogue des paramètres du réseau sans fil ne s'affiche plus. Je ne suis pas sûr pourquoi? J'ai essayé d'utiliser ShellExecute comme indiqué ci-dessous ShellExecute (IntPtr.Zero, "ouvert", myLnk, null, null, ShowCommands.SW_NORMAL) Cela ne semble pas fonctionner, j'ai donc changé les params comme ShellExecute (IntPtr.Zero, "ouvert", "explorer", myLnk, null, ShowCommands.SW_NORMAL) Avec l'appel ci-dessus, je reçois un avertissement de sécurité, cliquez sur le bouton Ouvrir ouvre la boîte de dialogue avec succès. comment supprimer warni –

+0

Ah, je suis sûr que vous * ne pouvez pas * désactiver cet avertissement de sécurité. Puisque vous l'ouvrez avec Explorer, vous êtes obligé de compter sur les mécanismes de sécurité d'Explorer, qui invitent l'utilisateur à ouvrir des raccourcis aléatoires dans certaines circonstances. Si vous pouviez outrepasser l'avertissement, ce n'est pas vraiment une barrière de sécurité, n'est-ce pas? ;) Le fichier batch n'est pas vraiment si mauvais d'une méthode. Vous pouvez conserver le code dans votre programme, l'écrire dans un fichier temporaire, puis masquer la fenêtre de commande résultante avec la propriété ProcessStartInfo.WindowStyle. Toujours, un kludge, mais ce serait transparent, non? – jasonh

+0

En outre, je ne sais pas pourquoi 'start wifi.lnk' à l'invite de commande ne fonctionne qu'une fois pour vous. Je peux le faire encore et encore et encore ... sans difficulté. – jasonh

Questions connexes