C#調用系統API指定快速鍵

來源:互聯網
上載者:User
文章目錄
  • 方法一
  • 方法二,調用API

快速鍵的作用大家都清楚,就是快捷嘛,操作起來方便.用電腦的人很少有沒用過Ctrl + C 和Ctrl + V的. 其他很多軟體也有各種快速鍵.電腦自然沒那麼聰明,知道我們敲哪些鍵然後給出相應反應,這都得我們自己寫代碼實現啊.指定快速鍵有兩種方式.

方法一.當應用程式某個頁面獲得焦點時,直接寫一個該頁面的KeyDown事件處理函數就行,非常的簡單.我們大多數時候就用的這種快速鍵.

方法二.在任何時候都能使用快速鍵,此時必須調用系統的API才行.這種情況我們用的不多.不過有個典型的例子,就是通過快速鍵切換IME.IME的應用程式肯定是通過API處理的.

 

方法一

我們知道點擊滑鼠,敲鍵盤都是觸發一個個的事件.那使用快速鍵自然是要寫個鍵盤敲擊的事件處理函數.我們知道每個控制項都可以對應很多事件.所以鍵盤的的事件處理自然可以和某一個控制項關聯起來.但一般不怎麼樣,因為這樣的話我們必須得先讓此控制項獲得焦點才行. 而我們很多時候可能希望只要是某個頁面開啟的情況下,不管焦點在其中的哪個控制項上都可以點快速鍵鍵.那我們應該把事件處理與頁面(Form)關聯起來.假如有頁面Form1.對應的事件處理函數如下.

 

private void Form1_KeyDown(object sender, KeyEventArgs e)

{

if (e.KeyCode == Keys.A)              //快速鍵a

{

    MessageBox.Show("hello arwen");

}

else if (e.KeyCode == Keys.F1)   //快速鍵F1

{

      MessageBox.Show("please help.");

}

else if (e.Control && e.Shift && e.KeyCode == Keys.F)   //快速鍵Ctrl + Shift + F

{

        MessageBox.Show("search some info.");

}

else if (e.Alt && e.KeyCode == Keys.X)               //快速鍵Alt + X

{

           MessageBox.Show("Close.");

}

}

 

在函數裡面可以通過e.KeyCode判斷是敲了哪個鍵.然後做相應的處理就OK.當然你也可以不用e.KeyCode.而是用e.KeyValue來判斷,KeyValue就是每個鍵上面的字母或符號對應的ASCII 碼值.

 

方法二,調用API

調用API最關鍵的地方就兩個

一是調用API函數RegisterHotKey

二是重寫函數WndProc.

 

下面就來看下具體的操作過程

 

第一步.引用命名空間

using System.Runtime.InteropServices;

添加此命名空間.C#中調用系統API都會用到這玩藝的.

 

第二步.申明API函數RegisterHotKey

[System.Runtime.InteropServices.DllImport("user32.dll")]

public static extern bool RegisterHotKey(IntPtr hWnd, int id, uint keyValue, Keys vk);

這樣聲明下就相當於你自己定義了一個函數RegisterHotKey,你只管在其他任意地方調用就行.只是這裡看不到函數的實現,相當於是在user32.dll這裡面給你實現了.

 

第三步.調用API函數

第二步已經給你整出個函數了.現在你就像用普通函數一樣來用就行.假如就在頁面剛載入時就調用此函數吧.

RegisterHotKey(Handle, 888, 2, Keys.F);  //指定Ctrl + F為快速鍵,並與數字888關聯

其中handle是啥控制代碼之類的,你只管寫上,具體不用管.在代碼裡代不會顯式用到它.888是啥呢? 第二步中參數列表可以看到這是id,所謂id就是通過一個數字唯一標誌啥嘛.所以這裡你隨便用個啥數都行的.在後面的函數WndProc函數中會用到這數字. 2是keyValue,不過只有幾個特殊鍵的值.比如Ctrl鍵對應的是2,Shift鍵對應的是4,Alt鍵對應的是1.都定好了的,你不能改.Keys.F就指定任意某個鍵.你可能會問如果是Ctrl + Shift這樣的組合怎麼辦?很簡單兩數字直接加起來就行.比如

RegisterHotKey(Handle, 444, 6, Keys.S); //指定Ctrl +Shift+ S為快速鍵,並與數字444關聯

第四步.重寫函數WndProc

前面三步非常好理解.就是調用個API中的函數嘛.雖然麻煩了點,但原理和調用一般函數差不多.但第四步有點難理解.在前面的方法一中我們知道可以通過調用一個事件處理鍵盤事件就OK.前面三步還沒有涉及到事件的概念.那你自然會想到第四步應該是整個事件處理才行啊.的確如此.在這裡就是指定一個事件調用的函數.只不過這個函數你看不到是哪裡調用了.實際上是作業系統來調用這函數的.原理有點複雜,可能你得去看下C++的訊息處理機制才明白.C#的底層那些實現實際上就是用C++寫的嘛.

這一步也可以簡單的理解為就是對應方法一中的事件處理函數

 

protected override void WndProc(ref Message m)

{

switch (m.Msg)

{

case 0x0312:

IntPtr id = m.WParam;

switch (id.ToString())

{

case "888":             //這裡的888就是前面調用函數RegisterHotKey指定的數字

MessageBox.Show("Help me."); break;

case "444":

MessageBox.Show("Search some info."); break;

}

break;

}

base.WndProc(ref m);

}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.