C#中建立程序的快捷方式

在 .NET 中建立快捷方式

 

Creating Shortcuts in .NET [C#]html

 

Written by Allen Lee程序員

 

圖1

建立快捷方式對於絕大多數 Windows 用戶來講都是小菜一碟了,然而,這項工做卻爲程序員帶來很多麻煩。.NET 沒有提供簡便直接的建立快捷方式的方法,那麼在 .NET 中咱們如何爲應用程序建立快捷方式呢?shell

 

1. 快捷方式文件express

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

圖2

你能夠看到一個快捷方式包含以下數據:緩存

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

 

2. 使用 WSH 建立快捷方式app

2.1 添加 WSH 的引用ide

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

圖3

2.2 建立你的快捷方式post

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

//  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-若是發生錯誤就返回一個異常

 

 

出處:https://www.cnblogs.com/woyaowenzi/archive/2008/09/11/1289344.html

相關文章
相關標籤/搜索