歡迎跟我連絡

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

2009年8月20日 星期四

鍵盤 Hook的應用

上篇文章提到Keyboard Hook,一般都會以為只能用在一些Hack程式(鍵盤側錄...),但是有很多程式是需要這個Keyboard Hook的支援,特別是那些失去Focus時候的應用程式,無法用KeyDown Event捕捉使用者的訊息,所以想要透過鍵盤的操控(快速鍵)達到"開始" ”停止" “擷取"……都可以透過這個方式達到目的.

底下是我寫的一個範例:

用途:全螢幕擷取程式,使用者可以設定圖檔存放處,擷取頻率...

當使用這按下[開始],程式最小化開始進行擷取,一直當使用者按下[Esc]就立即停止擷取,並將程式帶至桌面前景...

2009-8-20 下午 01-35-25

2009-8-20 下午 01-42-18

重要程式片段:

private void button_Start_Click(object sender, EventArgs e) 

     if (m_HookHandle == 0) 
         { 
             using (Process curProcess = Process.GetCurrentProcess()) 
             using (ProcessModule curModule = curProcess.MainModule) 
             { 
                 m_KbdHookProc = new HookProc(Form1.KeyboardHookProc); 
                 m_HookHandle = SetWindowsHookEx(WH_KEYBOARD_LL, m_KbdHookProc, GetModuleHandle(curModule.ModuleName), 0); 
             } 
             if (m_HookHandle == 0) 
             { 
                 MessageBox.Show("呼叫 SetWindowsHookEx 失敗!"); 
                 return; 
             } 
             StartProcess(); 
         } 
}

private static int KeyboardHookProc(int nCode, IntPtr wParam, IntPtr lParam) 

        // 當按鍵按下及鬆開時都會觸發此函式,這裡只處理鍵盤按下的情形。 
        bool isPressed = (lParam.ToInt32() & 0x80000000) == 0; 
        if (nCode < 0 || !isPressed) 
        { 
            return CallNextHookEx(m_HookHandle, nCode, wParam, lParam); 
        }

        // 取得欲攔截之按鍵狀態 
        KeyStateInfo escKey = KeyboardInfo.GetKeyState(Keys.Escape); 
        if (escKey.IsPressed) 
        { 
            System.Diagnostics.Debug.WriteLine("ESC Pressed!"); 
            bool ret = UnhookWindowsHookEx(m_HookHandle); 
            if (ret == false) 
            { 
                MessageBox.Show("呼叫 UnhookWindowsHookEx 失敗!"); 
                return 0; 
            } 
            m_HookHandle = 0; 
            StopFlg = true; 
            return 0; 
        } 
        return CallNextHookEx(m_HookHandle, nCode, wParam, lParam); 
  }

程式 [MD5 : 3bf4c56247725d8437605e17189626ef]

 

Source Code [MD5 : 6301e4c7e651ffa46959259adbd21447]

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 )

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 (轉大寫,應該是英文)

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