Avatar billede jimmynielsen Novice
18. oktober 2017 - 12:11 Der er 11 kommentarer og
1 løsning

Oprette genveje via kode

Jeg har en opgave, hvor jeg skal oprette 2 genveje i mappen c:\temp (lad os forudsætte at den findes, og at den er tom).
Genvejene skal hedde MyDocs.lnk og MyExcel.lnk (og bruge standard ikon til Explorer og Excel).
MyDocs.lnk skal linke til mappen "c:\users\<min bruger>\Doc".
MyExcel.lnk skal linke til filen "c:\users\<min bruger>\Doc\Personal.xlsx".

Det skal være helt simpelt og hard-coded
Avatar billede Slater Ekspert
18. oktober 2017 - 13:06 #1
Det er da en lidt mærkelig opgave, eftersom du er nødt til at bruge Windows Shell til det, og altså egentlig gå uden om C# og .NET, men du kan bruge WshShell og dens CreateShortcut() metode til det.

https://msdn.microsoft.com/en-us/library/aew9yb99(v=vs.84).aspx
Avatar billede Duborg Juniormester
18. oktober 2017 - 15:37 #2
Hej Jimmy

Her er 2 løsninger ved hjælp af HTML og CSS.




                                      (          Html Koden          )
<Div id="wrapper">
                                  ((((( 1. løsning her har du kun ikonet ))))
    <p>
    <a href="Din link sti"><img src="billed sti" height="20px" width="20px" alt=""></a>
    </p>   
                                      (((((Her kommer ikonet først og tekst efter følgene)))))
    <ul>   
                                       
      <li class="mydocs">

        <a href="Din link sti">
            <img src="billed sti" height="20px" width="20px" alt="MyDocs">
        </a>MyDocs.ink
</li>

  <li class="myexcel">

        <a href="Din link sti">
          <img src="billed sti" height="20px" width="20px" alt="MyExcel"> 
        </a>MyExcel.ink
</li>

    </ul>

  </Div>


                                (                    CSS Koden                )   
/*************
Link
*************/
ul {
  list-style-type: none;
}


.mydocs a{
  background-image:url('design/img/EXplorer.png');
  margin-right: 5px;
}

.myexcel a{
  background-image:url('design/img/EXplorer.png');
  margin-right: 5px;
}


Håber du kan tyde det og at det kan løse dit problem, ellers skriv hvis jeg skal prøve at ud dybe noget.

VH Duborg
Avatar billede Slater Ekspert
18. oktober 2017 - 15:41 #3
#2: Det er pænt af dig, men jeg tror du har overset, at spørgsmålet ligger i C#-kategorien.
Avatar billede Duborg Juniormester
18. oktober 2017 - 15:42 #4
ja det havde jeg ikke set :-)
Avatar billede arne_v Ekspert
19. oktober 2017 - 01:06 #5
WshShell er et COM object og .NET kan bruge COM objekter.


using System;

/*
* First (in IDE):
*  - Add reference
*  - COM
*  - Windows Script Host Object Model
*/
using IWshRuntimeLibrary;

namespace E
{
    public class Program
    {
        public static void Main(string[] args)
        {
            IWshShell shell = new WshShellClass();
            IWshShortcut shortcut = (IWshShortcut)shell.CreateShortcut(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\ShortcutDemo.lnk");
            shortcut.TargetPath = @"C:\Work";
            shortcut.Save();
            Console.ReadKey();
        }
    }
}
Avatar billede Slater Ekspert
19. oktober 2017 - 08:39 #6
#5: Hvordan havde du ellers tænkt dig at bruge det i .NET, hvis .NET ikke kunne bruge det?

Hvad jeg mener med at gå uden om .NET er, at objektet bare er en wrapper på en Windows API, dvs. du beder sådan set bare systemet om at oprette genvejen for dig. Eftersom opretters problem lød som en skoleopgave eller lignende, synes jeg det er en underlig opgave at give noget, hvor man egentlig ikke skal skrive 95% af den nødvendige kode selv, men bare bede systemet gøre det med tre linjer.
Avatar billede arne_v Ekspert
21. oktober 2017 - 02:38 #7
Man kan ogsaa bruge dynamic:


using System;

// Add ref to Microsoft.CSharp to be able to use dynamic for COM
namespace E
{
    public class Program
    {
        public static void Main(string[] args)
        {
            dynamic shell = Activator.CreateInstance(Type.GetTypeFromProgID("WScript.Shell"));
            dynamic shortcut = shell.CreateShortcut(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\ShortcutDemo.lnk");
            shortcut.TargetPath = @"C:\Work";
            shortcut.Save();
            Console.ReadKey();
        }
    }
}
Avatar billede arne_v Ekspert
21. oktober 2017 - 02:44 #8
@slater

MS har tilfoejet en masse muligheder til C# og .NET for at goere det nemt at bruge diverse Windows funktionalitet:

TLBimport for COM interop
dynamic for COM interop
DllImport for Win32 API usage
C++ mixed mode
namespace Microsoft.Win32

Jeg formoder at de har gjordt det for at det skal bruges.
Avatar billede jimmynielsen Novice
25. oktober 2017 - 11:17 #9
Den endelige kode ser sådan ud:
using System;
using System.IO;
using System.Windows.Forms;

namespace CreateShortcut
{
    class Program
    {
        static void Main(string[] args)
        {
            dynamic WshShell = Microsoft.VisualBasic.Interaction.CreateObject("WScript.Shell");
            if (args.Length > 0)
            {
                string strLinkFolder = "C:\\Links";
                string argsStr = args[0];
                string strTargetFolder = "";
                string strTargetFile = "";
                string tempStr = "";
                string tempChar = "";

                while (argsStr.Length > 0)
                {
                    tempChar = tempChar + argsStr.Substring(0, 1);
                    tempStr = tempStr + tempChar;
                    if (tempChar == "\\")
                    {
                        strTargetFolder = strTargetFolder + tempStr;
                        tempStr = "";
                    }
                    tempChar = "";
                    argsStr = argsStr.Substring(1, argsStr.Length - 1);
                }
                strTargetFile = tempStr;

                dynamic oShellLink = WshShell.CreateShortcut(strLinkFolder + "\\" + strTargetFile + ".lnk");
                oShellLink.TargetPath = strTargetFolder + "\\" + strTargetFile;
                oShellLink.WindowStyle = 1;
                oShellLink.Description = "CreateShortcut Link";
                oShellLink.WorkingDirectory = strLinkFolder;
                oShellLink.Save();
            }
        }
    }
}
Avatar billede arne_v Ekspert
26. oktober 2017 - 03:18 #10
Der er mange veje som foerer til Rom.

Jeg ville bruge Activator.CreateInstance fremfor Microsoft.VisualBasic.Interaction.CreateObject i C#. Men VB.NET runtime er fuldt tilgaengelig i C#.

Og jeg forstaar ikke den while loekke - den ser dybt suspekt ud!
Avatar billede arne_v Ekspert
26. oktober 2017 - 03:22 #11
Har:

            FileInfo fi = new FileInfo(argsStr);
            strTargetFolder = fi.DirectoryName + @"\";
            strTargetFile = fi.Name;

ikke samme funktion?
Avatar billede jimmynielsen Novice
26. oktober 2017 - 13:01 #12
Arne_v jeg tror du har ret - jeg kendte ikke de funktioner, men det gør jeg så nu 😊
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester