屏幕鍵盤必須是一個不能獲得輸入焦點的窗體,在這個窗體的構 造函數裡,可以安裝一個全局鼠標鉤子,再通過調用 SetWindowLong API 函數完 成。
1UserActivityHook hook = new UserActivityHook(true, true);
2hook.MouseActivity += HookOnMouseActivity;
3
4private void HookOnMouseActivity(object sener, HookEx.MouseExEventArgs e) {
5 Point location = e.Location;
6
7 if (e.Button == MouseButtons.Left) {
8 Rectangle captionRect = new Rectangle(this.Location, new Size (this.Width,
9 SystemInformation.CaptionHeight));
10 if (captionRect.Contains(location)) {
11 NativeMethods.SetWindowLong(this.Handle, KeyboardConstaint.GWL_EXSTYLE,
12 (int) NativeMethods.GetWindowLong(this.Handle, KeyboardConstaint.GWL_EXSTYLE)
13 & (~KeyboardConstaint.WS_DISABLED));
14 NativeMethods.SendMessage(this.Handle, KeyboardConstaint.WM_SETFOCUS, IntPtr.Zero, IntPtr.Zero);
15 } else {
16 NativeMethods.SetWindowLong(this.Handle, KeyboardConstaint.GWL_EXSTYLE,
17 (int) NativeMethods.GetWindowLong(this.Handle, KeyboardConstaint.GWL_EXSTYLE) |
18 KeyboardConstaint.WS_DISABLED);
19 }
20 }
21}
鼠標單擊標題欄,讓屏幕鍵盤可以接 收焦點,並激活,單擊其他部分則不激活窗體(如果激活了,其他程序必然取消 激活,輸入就無法進行了),這樣才可以進行輸入,並且保證了可以拖動窗體到 其他位置。
至此,一個屏幕鍵盤程序差不多完成了,能夠實現與實際鍵盤 完全同步。至於窗體,按鍵重繪,以及 Num Lock, Caps Lock,Scroll Lock 等鍵 盤燈的模擬,這裡就不講了,如果有興趣,可以下載完整的代碼。最後我們的屏 幕鍵盤程序運行的效果如下圖:
http://www.cnblogs.com/youzai/archive/2008/05/19/1202732.Html
本文配套源碼