天天看點

用Winform實作螢幕小鍵盤

前幾天碰到一個問題,需要使用Winform實作螢幕小鍵盤,研究了一下,有一個自認為比較完美的解決方案。

螢幕小鍵盤的實作方式很簡單,無非就是在窗體上加上幾個按鈕,然後在滑鼠的點選事件裡使用SendKeys.Send函數将按鈕代表的字元輸入到目前激活的視窗裡面。

是以如何保證小鍵盤視窗永遠不會擷取滑鼠焦點,是實作螢幕小鍵盤的關鍵。一般的視窗如果有滑鼠在它上面操作的話,那麼這個視窗預設就處于激活(Activated)狀态,所有的鍵盤滑鼠輸入都是被作業系統重定向到桌面上激活(Activated)狀态的窗體上。這樣就會産生類似下面描述的沖突:

1.       打開一個Windows程式,比如說notepad.exe。

2.       啟動螢幕小鍵盤程式keyboard.exe。

3.       在keyboard.exe上面點選按鈕,這時keyboard.exe處于激活狀态—因為它擷取到了滑鼠焦點。

4.       SendKeys.Send函數沒有辦法把對應的字元輸入到notepad.exe裡面,因為notepad.exe不能擷取滑鼠焦點—它不是桌面上處于激活狀态的視窗。

為了解決上面的沖突,Win32 API裡面,CreateWindowEx的第一個參數dwExStyle如果設定為WS_EX_NOACTIVATE,那麼建立的視窗則不會被作業系統設定為激活狀态。是以如果我們能夠在建立keyboard.exe的時候,通知Winform函數庫将其建立成一個WS_EX_NOACTIVATE就可以了,這就是為什麼Winform函數庫裡面有一個Form.CreateParams這個屬性,在從Form類繼承下來的窗體中重載這個屬性,就可以在Winform建立視窗之前,修改建立參數了。

下面是keyboard.exe小鍵盤視窗的源代碼, 當然在建立這個視窗的時候,最好将視窗的Topmost屬性設定為true。

    public partial class Form2 : Form

    {

        protected override CreateParams CreateParams

        {

            get

            {

                CreateParams cp = base.CreateParams;

                cp.ExStyle |= (int)0x08000000L;

                return cp;

            }

        }

        public Form2()

            InitializeComponent();

        // 螢幕小鍵盤上的一個按鈕“A”

        private void button1_Click(object sender, EventArgs e)

            SendKeys.Send("A");

    }

本文轉自 donjuan 部落格園部落格,原文連結:  http://www.cnblogs.com/killmyday/archive/2009/09/11/1564673.html ,如需轉載請自行聯系原作者