前幾天碰到一個問題,需要使用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 ,如需轉載請自行聯系原作者