2017年5月12日 星期五

C# 在背景執行全域鍵盤事件的GlobalKeyboardHook

一般Form表單上的keyDown鍵盤事件,必須是在Form成為Focus焦點的情況下才有辦法觸發,可是如果要寫個類似autohotkey之類,可在背景執行鍵盤事件的程式的話,就沒辦法了.

根據網路上查到的資料的說法,微軟的.Net Framework裡面並沒有可在背景執行鍵盤事件的方法,必須要自己寫程式,調用User32的API,或者,直接引用別人寫好的程式.

YouTube上這個影片展示了如何可以在背景監控鍵盤按鍵,並引發事件的方式
https://youtu.be/P1syNv_Qnio

作者的部落格也展示了這段程式碼
http://tutplusplus.blogspot.tw/2010/10/ultimate-keylogger-lesson-1-global.html

需要把GlobalKeyboardHook.cs這個檔案加入到專案的項目中,可以從作者的部落格上下載,也可以從我的雲端硬碟下載這個檔案,跟作者的部落格上所下載的是一樣的
https://drive.google.com/file/d/0BwcJdYDuBNwYa0JUS1VtN2ZVY1E/view?usp=sharing

我稍微改寫成我要的樣子:

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
//
//要用的變數和物件先宣告在這裡

        GlobalKeyboardHook gHook;
        int kv;//將keyValue轉成整數用的變數
        bool ctrl, alt, shift;//按下功能鍵時就改為true



//
//在Load事件裡要先載入
        private void Form1_Load(object sender, EventArgs e)
        {

            gHook = new GlobalKeyboardHook(); //根據作者的程式碼(class)創造一個新物件

            gHook.KeyDown += new KeyEventHandler(gHook_KeyDown);// 連結KeyDown事件

            foreach (Keys key in Enum.GetValues(typeof(Keys)))
            gHook.HookedKeys.Add(key);

            gHook.hook();//開始監控
        }

//
//把按下按鍵後要觸發的事件寫在這裡
        public void gHook_KeyDown(object sender, KeyEventArgs e)
        {
            kv = (int)e.KeyValue;//把按下的按鍵號碼轉成整數存在kv中

            switch (kv)
            {
                        case 65: break;//按下A之後要怎樣怎樣
                        case 66: break;//按下B之後要怎樣怎樣
                        case 112: break;//按下F1之後要怎樣怎樣
                        case 160: shift = true;//當按下左shift的時候布林值為真
                        case 161: shift = true;//當按下右shift的時候布林值為真
                        case 162: ctrl = true;//當按下左ctrl的時候布林值為真
                        case 163: ctrl = true;//當按下右ctrl的時候布林值為真
                        case 164: alt = true;//當按下左alt的時候布林值為真
                        case 165: alt = true;//當按下右alt的時候布林值為真
            }
        }


如果想要有keyUp事件的話,就在Load事件裡面加入這一條
gHook.KeyUp += new KeyEventHandler(gHook_KeyUp);

然後下面就可以寫入想要的keyUp事件了
        public void gHook_KeyUp(object sender, KeyEventArgs e)
        {
            kv = (int)e.KeyValue;//把按下的按鍵號碼轉成整數存在kv中

            switch (kv)
            {
                        case 160: shift = false;//當放開左shift的時候布林值為假
                        case 161: shift = false;//當放開右shift的時候布林值為假
                        case 162: ctrl = false;//當放開左ctrl的時候布林值為假
                        case 163: ctrl = false;//當放開右ctrl的時候布林值為假
                        case 164: alt = false;//當放開左alt的時候布林值為假
                        case 165: alt = false;//當放開右alt的時候布林值為假
            }
        }


如果我今天想要把程式寫成[按下Ctrl + F2的時候就可以怎樣怎樣]的話,就可以在keydown事件裡面加入這一條:

case 113: if (ctrl == true) {如此如此這般這般} break;

其他依此類推

如果想知道鍵盤按鍵所對應的號碼的話,可以查表,當然,也可以自己先寫一個超簡單的小程式來把keyValue的值顯示出來,下面這個就是我花不到十分鐘做的小程式,很簡陋,請不要介意
https://drive.google.com/file/d/0BwcJdYDuBNwYeTF0N09SVngzV1k/view?usp=sharing

沒有留言:

張貼留言

C# 自動滑鼠ATM_Lite ver0.97的程式碼

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq...