歡迎跟我連絡

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

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

2009年8月12日 星期三

簡體中文 繁體中文 轉換

UI Layout如下圖所示:


重要的Using:
using System.Runtime.InteropServices;

重要程式碼:
namespace 簡繁中文轉換
{
public partial class Form1 : Form
{
internal const int LOCALE_SYSTEM_DEFAULT = 0x0800;
internal const int LCMAP_SIMPLIFIED_CHINESE = 0x02000000;
internal const int LCMAP_TRADITIONAL_CHINESE = 0x04000000;

//Import WIN32API:LCMapString
[DllImport("kernel32", CharSet = CharSet.Auto, SetLastError = true)]
internal static extern int LCMapString(int Locale, int dwMapFlags, string lpSrcStr, int cchSrc, [Out] string lpDestStr, int cchDest);


public Form1()
{
InitializeComponent();
}

private void button_Translate_Click(object sender, EventArgs e)
{
if (textBox_TC.Text != string.Empty)
{
textBox_SC.Text = ToSimplified(textBox_TC.Text);
}
else if (textBox_SC.Text != string.Empty)
{
textBox_TC.Text = ToTraditional(textBox_SC.Text);
}
}
///


/// 繁體轉簡體
///

/// 要轉換的繁體字:體
/// 轉換後的簡體字:体
public static string ToSimplified(string pSource)
{
String tTarget = new String(' ', pSource.Length);
int tReturn = LCMapString(LOCALE_SYSTEM_DEFAULT, LCMAP_SIMPLIFIED_CHINESE, pSource, pSource.Length, tTarget, pSource.Length);
return tTarget;
}

/**////
/// 簡體轉繁體
///

/// 要轉換的繁體字:体
/// 轉換後的簡體字:體
public static string ToTraditional(string pSource)
{
String tTarget = new String(' ', pSource.Length);
int tReturn = LCMapString(LOCALE_SYSTEM_DEFAULT, LCMAP_TRADITIONAL_CHINESE, pSource, pSource.Length, tTarget, pSource.Length);
return tTarget;
}
}
}

參考資料:Win32 Programmer's Reference LCMapString

尚有其他轉換功能,可以自行研究
LOCALE_SYSTEM_DEFAULT = 0x0800;
LCMAP_FULLWIDTH = 0x00800000; //LCMAP_FULLWIDTH (轉全形字)
LCMAP_HALFWIDTH = 0x00400000; //LCMAP_HALFWIDTH (轉半形字)
LCMAP_HIRAGANA = 0x00100000; //LCMAP_HIRAGANA (轉成平假名,日文)
LCMAP_KATAKANA = 0x00200000; //LCMAP_KATAKANA (轉成片假名,日文)
LCMAP_LINGUISTIC_CASING = 0x01000000; //LCMAP_LINGUISTIC_CASINGLCMAP_UPPERCASE (不明)
LCMAP_LOWERCASE = 0x00000100; //LCMAP_LOWERCASE (轉小寫,應該是英文)
LCMAP_SIMPLIFIED_CHINESE = 0x02000000; //LCMAP_SIMPLIFIED_CHINESE (轉簡體)
LCMAP_SORTKEY = 0x00000400; //LCMAP_SORTKEY (不明)
LCMAP_TRADITIONAL_CHINESE = 0x04000000; //LCMAP_TRADITIONAL_CHINESE (轉繁體)
LCMAP_UPPERCASE = 0x00000200; //LCMAP_UPPERCASE (轉大寫,應該是英文)

2 8 10 16進位制轉換

UI Layout如下圖所示:

重要程式碼:
namespace 進制轉換
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
comboBox_From.SelectedIndex = 0;
comboBox_To.SelectedIndex = 2;
textBox_Source.Text = "0";
}

private void button1_Click(object sender, EventArgs e)
{
textBox_Result.Text = Convert2UrBase(textBox_Source.Text, int.Parse(comboBox_From.SelectedItem.ToString()), int.Parse(comboBox_To.SelectedItem.ToString())); }
public string Convert2UrBase(String Input_Value, int FromBase, int ToBase)
{
long RtnValue;
try
{
RtnValue = Convert.ToInt64(Input_Value, FromBase);
}
catch (Exception other)
{
RtnValue = 0;
}
return Convert.ToString(RtnValue, ToBase);
}

}
}

C# 3.0提供Dictionary新的宣告法

這是3.0以前的宣告方式
Dictionary myDictionary = new Dictionary();
myDictionary.Add("Candy", "住址wwwwww");
myDictionary.Add("Jony", "住址xxxxx");
myDictionary.Add("Mary", "住址yyyyy");
myDictionary.Add("Nelson", "住址zzzzz");


3.0起,強化了Collection Initializer,所以你可以改成這樣的宣告
Dictionary dctNewWay = new Dictionary() {
{"Candy", "住址wwwwww"},
{"Jony", "住址xxxxx"},
{"Mary", "住址yyyyy"},
{"Nelson", "住址zzzzz"}
};

這樣的方式
就像是宣告固定元素的陣列
string[] NameList = { "Candy", "Jony", "Mary", "Nelson" };

2009年7月10日 星期五

Parallel運算 in .NetFramework 4.0出現

架構圖


使用前必須先Using
System.Threading
System.Threading.Tasks
這兩個NameSpace

簡單範例:
....
Parallel.Invoke(
() => MethodA(),
() => MethodB(),
() => MethodC() );
....

private void MethodA()
{
MessageBox.Show("This is Method A");
}

private void MethodB()
{
MessageBox.Show("This is Method B");
}

private void MethodC()
{
MessageBox.Show("This is Method C");
}


相關文章:
http://msdn.microsoft.com/zh-tw/dd996613.aspx
http://msdn.microsoft.com/en-us/concurrency/default.aspx
http://msdn.microsoft.com/en-us/library/dd460693(VS.100).aspx

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狀態(我在線上時,可以跟我交談喔)