歡迎跟我連絡

本頁最下方有Web MSN可以直接跟我交談喔!
免安裝程式...哈哈 歡迎聊天
顯示具有 VS2008 標籤的文章。 顯示所有文章
顯示具有 VS2008 標籤的文章。 顯示所有文章

2009年8月18日 星期二

鍵盤 Keyboard Hook

一個簡單的鍵盤Hook程式...

基本上都是Win32API兜出來的...

SetWindowsHookEx() , UnhookWindowsHookEx() , CallNextHookEx() , GetCurrentThreadId() ,GetModuleHandle()

目前只針對 Ctrl , Alt , Shift , F8 進行觸發後紀錄...

有興趣的人可以自行修改,底下有Source Code

2009-8-18 下午 10-22-23

2009-8-18 下午 10-22-42

Source Code ( MD5 : 7c32ae81d92a624111c655ea2a2bc196 )

C# 3.0 物件初始化的新方式 (Object Initializer)

看範例

定義Person類別

public class Person
{
    public string Name;
    public int Age;
    public int Height;
    public int Weight;
    public string Country;
    public string PhoneNo;

    //預設建構式 
    public Person() { }

    //建構式(1)
    public Person(string name)
    {
        this.Name = name;  
    }

    //建構式(2)
    public Person(string name, int age)
    {
        this.Name = name;
        this.Age= age; 
    }
}

C#2.0 初始化物件方式

//使用預設建構式初始化
Person Tony= new Person();
Tony.Name= "Tony";
Tony.Country = "Chinese";

//使用建構式(1)
Person Tony = new Person("Tony"); 

//使用建構式(2)
Person Tony = new Person("Tony ", 23);

C#3.0 初始化物件一個新方式(舊的也是沿用)

Person Mary = new Person

    Name= "Tony";
    Age= "23";
    Height=177;
    Weight=78;
    Country = "Chinese";
    PhoneNo= "07-3333333";
};

優點:

(1)程式的精簡
(2)提供類似建構式指定參數方式初始化物件
(3)可以任意呼叫所有公開的欄位或屬性,不需要刻意建立多個建構式

至於方不方便,見仁見智吧...

另外泛型也新增了類似的方式

C# 2.0之泛型語法建立之LIST
    List<string> models = new List<string>();
    models.Add("Kevin");
    models.Add("Mary");
    models.Add("Clare");
    models.Add("Joe");
    models.Add("Mark");

C# 3.0之集合初始化(Collection Initializer)建立之List集合
    List<string> Models= new List<string>{ "Kevin", "Mary", "Clare", "Joe", "Mark" };

 

2009-8-12 下午 12-42-23

簡易MD5驗證程式

因為部落格中開始會有一些自己寫的程式或檔案可以提供下載並使用MD5驗證機制,所以就寫了一支簡單的MD5驗證程式提供使用...

使用介紹:

 2009-8-18 上午 10-31-39 2009-8-18 上午 10-32-09 2009-8-18 上午 10-32-312009-8-18 上午 10-38-372009-8-18 上午 10-41-26

程式: [MD5 : c3130b3057182ad2b4be4626cb16fd18]

 

Source Code : [MD5 : 52613fc671c60e086ca05a1cc14b4792]

2009年8月17日 星期一

Indexer(索引器) in C#

透過索引器機制,能夠讓你像陣列一樣的爲物件編寫索引值,這是屬性提供的一個有效率的方式來管理類別的實體資料,看以下範例

(1)建立Telephone Class

public class Telephnoe
{
    private string[] _telephone = new string[3];

    public string this[int index]
    {
        get
        {
            if(index >=0 || index < _telephone.Length)
             {
                 return _telephone[index];
             }
             return string.Empty;
         }
         set
         {
             if (index >= 0 || index < _telephone.Length)
             {
                 _telephone[index] = value;
             }
         }
     }
}

 

(2)建立Person Class

public class Person  
{  
      public string Name { get; set; }  
      public Telephone Telephones = new Telephone();  
}

使用範例:

// 宣告 Person 類別物件變數 Person  
Person myPerson = new Person();  
// 設定一般 Name 屬性,無法帶入參數  
person.Name = "王小明";  
// 設定可代入參數的 Telephones 屬性  
person.Telephones[0] = "07-3333333";  
person.Telephones[1] = "0960666333";  
// 讀取一般性 Name 屬性 
Console.WriteLine(person.Name); 
// 設定可代入參數的 Telephones 屬性 
Console.WriteLine(person.Telephones[0]); 
Console.WriteLine(person.Telephones[1]);

輸出結果:

王小明  
電話:07-3333333 
電話:0960666333

2009-8-12 下午 12-35-02

2009年8月16日 星期日

MP3 Tag 修改程式

想必各位一定都有聽MP3的習慣,但是有時候MP3 Player所顯示的資訊是錯誤的,或者是亂碼,怎麼辦???

這時候你就會需要MP3 Tag修改軟體.

MP3的 TAG大概是這樣組成的

MP3 TagBody (檔案的最後128 Bytes為TAG) 編碼方式 :
(0—2)      3 bytes ==> "TAG"三個字,如果不是"TAG",則為MPEG File
(3—32)     30 bytes ==> 標題 (Title)
(33—62)   30 bytes ==> 演唱/奏者,藝術家 (Artist)
(63—92)   30 bytes ==> 專輯名稱 (Album)
(93—96)   4bytes   ==> 發行年份 (PubYear)
(97—126) 30 bytes ==> 註釋/附加/備註信息 (Comment)
(127)       1 byte  ==> 音樂型態 (Music Type)

ID3v1 ID3v11

根據上面的編碼原則,寫的一個Parser Class

2009-8-16 下午 09-27-45

MP3TagParser Class

 

應用程式畫面

2009-8-16 下午 09-28-46

Source Code

Int / String to Enum in C#

enum myEnum {…………}

From a string:

myEnum foo = (myEnum)Enum.Parse(typeof(myEnum), yourString);

From an int:

myEnum foo = (myEnum)yourInt;


2009-8-12 下午 12-35-33 

2009年8月14日 星期五

防止程式重複啟動的方法(二)

曾經在一篇文章介紹過這個方法(請參考如何讓你的程式只能啟動一次 in C#)

今天再紹另一種方法 System.Diagnostics命名空間中的Process.GetProcessesByName…

範例程式如下:

Using System.Diagnostics;

...

private void FormMain_Load(object sender, EventArgs e)
{
       if (Process.GetProcessesByName(

                  Process.GetCurrentProcess().ProcessName).Length > 1)           

      {
          Dispose();
      }

}

在Form Load Event中,新增這段程式碼即可...

 

2009-8-12 下午 12-30-53

2008年8月19日 星期二

如何讓你的程式只能啟動一次 in C#

有時候,因為某些緣故(例如:搶同一個TCP/IP Port Listen),同一隻程式不可以啟動兩次(含)以上...
可以這樣處理,打開Program.cs

加入以下程式碼(粗體自部分),就OK了
static class Program
{
///


/// The main entry point for the application.
///

static Mutex appMutex;

[STAThread]
static void Main()
{
bool createNew;
appMutex = new Mutex(true, "xxxxx", out createNew); // xxxxx 是自己取的名稱
if (!createNew)
{ // 表示已經有同名的 Mutex
appMutex.Close();
appMutex = null;
MessageBox.Show("Another xxxxxx already Startup !","Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}

Application.ApplicationExit += OnApplicationExit;
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new FormMain());
}

static void OnApplicationExit(object sender, EventArgs e)
{
if (appMutex != null)
{
appMutex.ReleaseMutex();
appMutex.Close();
}
}

}

或是在Form Load Event中這樣寫

using System.Threading;
....

private void FormMain_Load(object sender, EventArgs e)
{
bool IsExist;
Mutex MyMutex = new Mutex(true, "MyApplication", out IsExist);
//其中MyApplicationd可以是任意字眼...
if(IsExist)
{
Dispose();//關閉
}
}


MSN狀態(我在線上時,可以跟我交談喔)