用Winform實現螢幕小鍵盤

來源:互聯網
上載者:User

前幾天碰到一個問題,需要使用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");

        }

    }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.