---恢復內容開始---
Input Injection 直譯為:輸入注入。通俗的譯法為:模擬輸入。此注入行為可以模擬以下幾種輸入行為:
1、鍵盤按鍵。
2、鼠標。
3、觸控。
4、書寫筆輸入。
5、快捷鍵。這個有限制,僅限於如按 Win 鍵、后退鍵。
支持輸入行為注入的API都在 Windows.UI.Input.Preview.Injection 命名空間下,命名空間帶有 【Preview】字樣,估計這個功能還在試運行階段。
這個所謂的注入功能,簡單地說就是可以在UWP應用中模擬鍵盤輸入、鼠標操作等行為,當然,根據UWP的安全性方案,不可能像過去 Win 32 那樣讓你到處亂注,在UWP中,你只能注入當前進程中的UI行為,意思你懂的,不用多說,就是你的應用只能干你的事,不要搔擾別人。
老周個人覺得這個注入 API 沒什么用,不過既然 SDK 中有,咱們就了解一下吧。
由於這堆 API 是受限制的,所以很多朋友嘗試調用,結果發生了異常。好,先賣個關子,后文再談。
還是老規矩,先給大伙說說怎么用。其實也很簡單,核心類是 InputInjector, 這個類你不能調用構造函數,要使用它,你要調用靜態方法 TryCreate ,調用后會返回一個 InputInjector 實例。
然后,你可以根據需要調用以下方法來發送輸入行為。
1、InjectTouchInput,模擬手指觸控行為,參數是一組 InjectedInputTouchInfo 實例,每個 InjectedInputTouchInfo 實例代表一次觸控,主要參數有觸控點坐標,角度(比如雙指旋轉,方向為逆時針),力度。
2、InjectMouseInput,模擬鼠標。方法參數由一組 InjectedInputMouseInfo 對象組成,單個 InjectedInputMouseInfo 對象描述鼠標坐標、左鍵按下或者彈起,等等。
3、InjectPenInput,模擬筆的輸入(如電磁筆),數據由一個 InjectedInputPenInfo 對象描述,如筆尖按下的位置等。
4、InjectKeyboardInput,模擬鍵盤輸入,數據由一組 InjectedInputKeyboardInfo 對象描述,對數內容大伙都能猜到,當然就跟要按下的鍵的虛鍵碼有關。
好,下面老周弄個模擬鍵盤輸入的示例。
<StackPanel Margin="20"> <TextBox Name="txt" /> <StackPanel Margin=" 2,15" Orientation="Horizontal"> <Button Content="A" Style="{StaticResource btnst}" Click="OnClick"/> <Button Content="B" Style="{StaticResource btnst}" Click="OnClick" /> <Button Content="C" Style="{StaticResource btnst}" Click="OnClick" /> <Button Content="D" Style="{StaticResource btnst}" Click="OnClick" /> <Button Content="E" Style="{StaticResource btnst}" Click="OnClick" /> <Button Content="F" Style="{StaticResource btnst}" Click="OnClick" /> <Button Content="G" Style="{StaticResource btnst}" Click="OnClick" /> </StackPanel> </StackPanel>
界面沒什么玄機,一個 TextBox 當然是用來接收輸入的,其他一串 Button 當然是模擬鍵盤按鈕。
這些按鈕都共享同一個Click事件處理方法——OnClick。
接下來是寫處理代碼。
首先,在頁面類級別聲明變量。
InputInjector injector = null; …… injector = InputInjector.TryCreate();
隨后處理Click事件。
private void OnClick(object sender, RoutedEventArgs e) { Button btn = (Button)sender; string content = btn.Content as string; char c = content[0]; InjectedInputKeyboardInfo keyinfo = new InjectedInputKeyboardInfo(); keyinfo.VirtualKey = (ushort)c; InjectedInputKeyboardInfo[] infos = { keyinfo }; // 讓文本框獲得鍵盤焦點,不然輸不進去 txt.Focus(FocusState.Keyboard); injector.InjectKeyboardInput(infos); }
這段代碼也很簡單,一排按鈕,它們的Content屬性分別是字母A B C D E F G,當按鈕被點擊后,取出這個字符,並用 Char 類型表示,為啥要用它呢,這是為了可以轉換為整數值,因為鍵碼實際是字符的ASCII碼。
得到鍵碼后,賦值給 InjectedInputKeyboardInfo 對象的 VirtualKey 屬性,就指定了要按下哪個鍵了。
這里有一點各位要注意,就是在你發送輸入行為前一定要加這一行。
txt.Focus(FocusState.Keyboard);
你想啊,要模擬鍵盤把字符輸入到輸入框中,所以你得先確保這個輸入框已經獲得鍵盤焦點。
示例完成后,你一定會興高采烈地運行,結果……
想哭吧? 別哭,你又不是林妹妹,哭什么。
此時你一查 SDK 文檔,一拍腦子,是了,這么木馬般的行為怎么輕易調用呢,一定要配置清單文件。這種高級行為需要在清單文件中引入這個命名空間:
http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities
然后,你看了文檔,知了,要加入這個聲明:
<Capabilities> <Capability Name="internetClient" /> <restcap:Capability Name="inputInjection" /> </Capabilities>
是的,這個思路也沒有錯,而且,如果你的應用要提交到應用商店的話,也要這樣聲明。
然而,當你再次運行的時候,你又想哭了。
這TMD怪了,怎么還是無權限訪問呢,因為你懂的,太敏感的行為,你是得到應用商店上申請合作,才能使用的。
是不是就不能用了呢。其實不是的,下面老周告訴你答案。
你應該把 Capability 的 Name 改為 inputInjectionBrokered。就是這樣改。
<Capabilities> <restcap:Capability Name="inputInjectionBrokered" /> </Capabilities>
這個秘密老周忍不住告訴大伙了,老周花了五毛錢買通了微軟的開發團隊得到了這個秘密。
好,這樣改了以后,你一定會微笑着面對生活的,看看效果。
驚喜吧。
驚喜完了之后,老周告訴你一個壞消息,這樣處理后是不能提交到應用商店的。
好了,老周就分享到這里了,該開飯了,今天晚上大廚子阿強要請我和幾個哥們吃飯,他老人家親自下廚。所以,這博文該收尾了。
示例代碼下載:http://files.cnblogs.com/files/tcjiaan/inputInjectionSample.zip