OK,剛看到C#Winform實現簡單的虛擬鍵盤這個博文,想起前段時間做的一個功能簡單的小輔助程式【功能:實現一表單始終置頂,但不佔用焦點。對於需要多次重複輸入的字串,實現了滑鼠點擊即可在外部程式輸入】。
然後就回想下思路留作曾經存在的痕迹(勿噴)。
最初代碼和思路與上面部落格內容所差無幾;先發原來的代碼:
1 protected override CreateParams CreateParams 2 { 3 get 4 { 5 const int WS_EX_NOACTIVATE = 0x08000000; 6 7 CreateParams cp = base.CreateParams; 8 cp.ExStyle |= WS_EX_NOACTIVATE; 9 return cp;10 }11 }
主要實現表單始終置前但不佔用焦點,並向外部程式發送字串!
在相應事件處理中添加:SendKeys.Send("some characters");
但有一點兒,也是實現這個小程式中遇到的最大的麻煩:SendKeys.Send()不能發送漢字,會被表單IME先行處理,無奈……
解決思路:起初,我是想通過控制IME來實現:主要使用 InputLanguage.CurrentInputLanguage 屬性,但後來發現IME為不同的視窗儲存的是不同的設定,因此不能在一個程式裡面設定另外一個程式的IME狀態(通過低層API可能實現),同時也找了很多其他API,都沒法實現(或者我沒找到);【很有可能通過 SystemParametersInfo 可以實現】(在一些地方提了下問題,呵呵,不過當再次看到回答的時候,博友給出思路的時候已經想到了,並且問題已經解決了……)
後來換了下思路,調用系統剪貼簿實現:
1 Clipboard.SetText(“some characters”);2 3 SendKeys.Send("^v"); //類比Ctrl+V:
因為程式限制,所以不能儲存原剪貼簿內容,在其他地方使用時建議最好在設定剪貼簿之前儲存剪貼簿內容:
1 IDataObject idata = Clipboard.GetDataObject();2 3 Clipboard.SetText(some characters);4 SendKeys.Send("^v");5 6 Clipboard.SetDataObject(idata);
程式表單是要向外部活動表單來發送字串,所以無法擷取目標表單控制代碼,就沒法用SendMessage(),代替的是類比按鍵SendKeys.Send()或SendKeys.SendWait(),當然,用keyboard_event也可以,但這些都是類比按鍵,是會被目標表單的IME處理的。
使用 GetForegroundWindow 找不到相應表單控制代碼……
有點遺憾就是:在移動表單位置的時候,沒有留影子,主要是這個函數的結果:protected override CreateParams CreateParams ,但一直找不到解決方案……
本文地址:http://www.cnblogs.com/Interkey/archive/2013/02/02/2889735.html
內容很亂,僅做參考,可提意見,但勿噴~
學東西,要主學其思想,不能只學代碼;代碼是人家的,思想才是自己的。