天天看點

在 .NET 中建立快捷方式

Creating Shortcuts in .NET [C#]

Written by Allen Lee

在 .NET 中建立快捷方式

建立快捷方式對于絕大多數 Windows 使用者來說都是小菜一碟了,然而,這項工作卻為程式員帶來不少麻煩。.NET 沒有提供簡便直接的建立快捷方式的方法,那麼在 .NET 中我們如何為應用程式建立快捷方式呢?

1. 快捷方式檔案

快捷方式實質上是一個擴充名為 .LNK 的檔案。右擊一個快捷方式檔案并選擇屬性,跳到快捷方式頁籤,如圖2所示:

在 .NET 中建立快捷方式

你可以看到一個快捷方式包含如下資料:

  • 快捷方式的名字
  • 快捷方式所指向的目标所在的位置
  • 快捷方式所指向的目标的工作目錄
  • 激活該快捷方式的熱鍵
  • 快捷方式所指向的目标運作時的視窗風格(普通、最大化和最小化)
  • 該快捷方式的描述性文字
  • 快捷方式的圖示所在的位置

2. 使用 WSH 建立快捷方式

2.1 添加 WSH 的引用

這裡我使用 Visual C# 2005 Express Edition Beta 2 來開發的,添加引用的方法非常簡單,右擊你的項目并選擇添加引用,選擇 COM 頁籤并選擇 Windows Script Host Object Model,如圖3所示:

在 .NET 中建立快捷方式

2.2 建立你的快捷方式

建立一個快捷方式的完整代碼如下:

在 .NET 中建立快捷方式

//  Code #01

在 .NET 中建立快捷方式
在 .NET 中建立快捷方式

using  System;

在 .NET 中建立快捷方式

using  IWshRuntimeLibrary;

在 .NET 中建立快捷方式
在 .NET 中建立快捷方式

class  Program

在 .NET 中建立快捷方式

{

在 .NET 中建立快捷方式

    static void Main(string[] args)

在 .NET 中建立快捷方式

    {

在 .NET 中建立快捷方式

        WshShell shell = new WshShell();

在 .NET 中建立快捷方式

        IWshShortcut shortcut = (IWshShortcut)shell.CreateShortcut(

在 .NET 中建立快捷方式

            Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) +

在 .NET 中建立快捷方式

            "//" + "Allen's Application.lnk"

在 .NET 中建立快捷方式

            );

在 .NET 中建立快捷方式

        shortcut.TargetPath = System.Reflection.Assembly.GetExecutingAssembly().Location;

在 .NET 中建立快捷方式

        shortcut.WorkingDirectory = System.Environment.CurrentDirectory;

在 .NET 中建立快捷方式

        shortcut.WindowStyle = 1;

在 .NET 中建立快捷方式

        shortcut.Description = "Launch Allen's Application";

在 .NET 中建立快捷方式

        shortcut.IconLocation = System.Environment.SystemDirectory + "//" + "shell32.dll, 165";

在 .NET 中建立快捷方式

        shortcut.Save();

在 .NET 中建立快捷方式

    }

在 .NET 中建立快捷方式

}

首先,我們建立一個 WshShell 的執行個體對象,接着通過該對象的 CreateShortcut 方法來建立 IWshShortcut 接口的執行個體對象,傳遞給 CreateShortcut 方法的參數是将要建立的快捷方式的完整路徑(包括該快捷方式的名字)。接下來,我們就要設定 IWshShortcut 執行個體對象的相關屬性值了。

2.3 設定快捷方式的屬性

2.3.1 TargetPath

該屬性僅用于設定或者讀取快捷方式的目标所在的位置。Code #01 中,将要建立的快捷方式指向本應用程式。

2.3.2 WorkingDirectory

該屬性指定應用程式的工作目錄,當使用者沒有指定一個具體的目錄時,快捷方式的目标應用程式将使用該屬性所指定的目錄來裝載或儲存檔案。

2.3.3 WindowStyle

該屬性指定快捷方式的目标應用程式的視窗為普通(原始)狀态、最小化或者最大化。對比圖1中 Run 下拉菜單的項,該屬性的值及其意義如下:

Value Meaning
1 Normal window
3 Maximized
7 Minimized

2.3.4 Description

該屬性設定用于設定或者讀取快捷方式的附加說明。

2.3.5 IconLocation

該屬性用于指定快捷方式的圖表的所在位置,它的值包含一個完整的路徑和一個索引值。Code #01 中,快捷方式的圖示被設定為系統檔案夾中的 Shell32.dll 檔案所包含的第165個圖示。

2.4 生成快捷方式

CreateShortcut 僅僅建立一個 IWshShortcut 的執行個體對象,它不會為你生成任何快捷方式,當一切就緒後,你必須調用 IWshShortcut.Save 方法才能生成快捷方式檔案。

3. 活用快捷方式簡化操作

想象一下你的應用程式支援指令行參數組合運作,例如:

App /out:output.txt /sortby:date /desc

而你又希望隻需要輕輕按下 CTRL+ALT+F11 就可以直接啟動這項功能,這時你就需要用到 IWshShortcut 的 Arguments 和 Hotkey 兩個屬性了:

在 .NET 中建立快捷方式

//  Code #02

在 .NET 中建立快捷方式
在 .NET 中建立快捷方式

shortcut.Arguments  =   " /out:output.txt /sortby:date /desc " ;

在 .NET 中建立快捷方式

shortcut.Hotkey  =   " CTRL+ALT+F11 " ;  

注意:Hotkey 屬性的值裡面不能包含空格。

你可以在應用程式裡面像平常那樣處理指令行參數:

在 .NET 中建立快捷方式

//  Code #03

在 .NET 中建立快捷方式
在 .NET 中建立快捷方式

class  Program

在 .NET 中建立快捷方式

{

在 .NET 中建立快捷方式

    static void Main(string[] args)

在 .NET 中建立快捷方式

    {

在 .NET 中建立快捷方式

        foreach (string arg in args)

在 .NET 中建立快捷方式

        {

在 .NET 中建立快捷方式

            Console.WriteLine(arg);

在 .NET 中建立快捷方式

        }

在 .NET 中建立快捷方式

    }

在 .NET 中建立快捷方式

}

在 .NET 中建立快捷方式
在 .NET 中建立快捷方式

//  Output:

在 .NET 中建立快捷方式

//

在 .NET 中建立快捷方式

//  /out:output.txt

在 .NET 中建立快捷方式

//  /sortby:date

在 .NET 中建立快捷方式

//  /desc

現在,你把這個快捷方式放到桌面,每當你需要運作的時候,輕輕的按下 CTRL+ALT+F11 就行了,Cool ~ ~ ~

Appendix A

Mattias Sjogren 建立了一個名叫 ShellShortcut 的包裝類(wrapper class),你可以在你的項目中直接使用它。有興趣的話,你也可以對其進行一番研究。

注:以上部分為摘抄

按照上面的建立出一個連結後,想删除掉怎麼辦了。發現這個類裡面沒有相應的删除函數,仔細想想,這個連結應該是個檔案,應該可以拿删除檔案的方法來删除。上網一查,還真是,呵呵。做法是:能

先用找到連結相應的路徑,然後檢視連結檔案是否存在,如果存在就将是删除掉。

我自己的代碼:

                string filepath = Environment.GetFolderPath(Environment.SpecialFolder.Startup) +

                    "//" + "XXX.lnk";

                if(System.IO.File.Exists(filepath))

                {

                    System.IO.File.Delete(filepath);

                }

以下部分為摘抄:

原文位址:

http://www.codeproject.com/KB/cs/SharpWipe.aspx

您可以在上述位址中獲得源代碼

       事實上,調用File.Delete并沒有删除檔案,它隻是讓作業系統認為檔案不存在,檔案在磁盤上的空間被标記成空的,以便用于再次使用。但是檔案的資料沒有被移除,您可以非常容易恢複。被删除的檔案直到相應的空間被重寫才會真消失,這也許要很長時間。

       作者提供了一個簡單的類,它被用來在删除檔案之前向檔案寫入垃圾資料,這樣就令檔案的資料不再存在。

為了實作這一步,需将檔案大小置為0位元組,并且修改了檔案日期。不過,修改檔案日期隻能在FAT16/32上有效,在NTFS上就沒效果。

       在使用Ontrack EasyRecovery,PC Inspector File Recovery和GetDataBack測試後,已經做到不能恢複任何檔案了。在删除一個文本檔案後,我即使運作Investigator,确認獨立的簇,還是無法從這檔案得到一個文字。

        代碼

        你隻需要調用一個方法:WipeFile,下面是這個方法的代碼:

如果你調用了WipeFile,你需要提供要删除檔案的絕對路徑和你想重寫資料的次數。

public void WipeFile(string filename, int timesToWrite)

{

    try {

        if (File.Exists(filename)){

            File.SetAttributes(filename, FileAttributes.Normal); //設定檔案的屬性為正常,這是為了防止檔案是隻讀

            double sectors = Math.Ceiling(new FileInfo(filename).Length/512.0); //計算檔案中的扇區數目

            byte[] dummyBuffer = new byte[512]; // 建立一個扇區大小的虛拟緩存

            RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); //建立一個加密随機數目生成器這是我用來生成垃圾資料的。

            FileStream inputStream = new FileStream(filename, FileMode.Open);  //打開這個檔案的FileStream

            for (int currentPass = 0; currentPass < timesToWrite; currentPass++){

                UpdatePassInfo(currentPass + 1, timesToWrite);

                inputStream.Position = 0;

                // 循環所有的扇區

                for (int sectorsWritten = 0; sectorsWritten < sectors; sectorsWritten++){

                    UpdateSectorInfo(sectorsWritten + 1, (int) sectors);

                   // 把垃圾資料填充到流中

                    rng.GetBytes(dummyBuffer);

                    inputStream.Write(dummyBuffer, 0, dummyBuffer.Length);           

                    sectorsWritten++;

                }

            }

            inputStream.SetLength(0);

            inputStream.Close();

            // 原始日期需要清空

            DateTime dt = new DateTime(2037, 1, 1, 0, 0, 0);

            File.SetCreationTime(filename, dt);

            File.SetLastAccessTime(filename, dt);

            File.SetLastWriteTime(filename, dt);

            File.Delete(filename); // 最後删除檔案

            WipeDone();

        }

    }

    catch(Exception e){

        WipeError(e);

    }

}

作者還添加了幾個事件,以便在處理過程中知道發生什麼

•PassInfoEvent-傳回哪個通道正在運作,和運作的通道的總數。

•SectorInfoEvent-傳回哪個硬碟扇區正在被寫上資料,和扇區的總數

•WipeDoneEvent-wipe處理過程完成的訓示器

•WipeErrorEvent-如果發生錯誤就傳回一個異常