文章出處

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

 

1. 快捷方式文件

快捷方式實質上是一個擴展名為 .LNK 的文件。右擊一個快捷方式文件并選擇屬性,跳到快捷方式選項卡,如圖2所示:

圖2

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

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

 

2. 使用 WSH 創建快捷方式

2.1 添加 WSH 的引用

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

圖3

2.2 創建你的快捷方式

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

// Code #01

using System;
using IWshRuntimeLibrary;

class Program
{
    static void Main(string[] args)
    {
        WshShell shell = new WshShell();
        IWshShortcut shortcut = (IWshShortcut)shell.CreateShortcut(
            Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) +
            "\\" + "Allen's Application.lnk"
            );
        shortcut.TargetPath = System.Reflection.Assembly.GetExecutingAssembly().Location;
        shortcut.WorkingDirectory = System.Environment.CurrentDirectory;
        shortcut.WindowStyle = 1;
        shortcut.Description = "Launch Allen's Application";
        shortcut.IconLocation = System.Environment.SystemDirectory + "\\" + "shell32.dll, 165";
        shortcut.Save();
    }
}

首先,我們創建一個 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 兩個屬性了:

// Code #02

shortcut.Arguments = "/out:output.txt /sortby:date /desc";
shortcut.Hotkey = "CTRL+ALT+F11";
 

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

你可以在應用程序里面像平常那樣處理命令行參數:

// Code #03

class Program
{
    static void Main(string[] args)
    {
        foreach (string arg in args)
        {
            Console.WriteLine(arg);
        }
    }
}

// Output:
//
// /out:output.txt
// /sortby:date
// /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-如果發生錯誤就返回一個異常 


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()