BloggerAds

2015年6月10日 星期三

[筆記] 一個簡單的方法來偵測使用者是否開啟 Window 10 的 Tablet Mode


Windows 10 即將在 7/29 上市,維護產品相容性的責任自然而然就會被降臨在工程師頭上,尤其是 OEM 測試到的問題竟更是推託不掉!

最近回報了一個問題,說是我們的產品在 Windows 10 上的 Tablet Mode 有操作上問題,請我們這裡查清楚並解決它!老實說我們的產品並不支援平板操作阿!OEM 的老大你們是在哀號什麼意思的阿?

好吧!既然問題都來了,就來操作看看倒底是發生了什麼事情吧!取得 Windows 10 環境並研究如何開啟 Tablet Mode 之後發現,原來這個模式不能做「復原視窗化」的動作!

Tablet Mode 可以參考下面這段影片展示:


什麼是「復原視窗化」的動作?就是在程式視窗最大化之後,按下位於關閉的按鈕左邊的鄰居,這時候就是做「復原視窗化」的動作,讓程式回到視窗模式!但 Tablet Mode 強迫所有的程式都執行在最大化或是最小化,是沒有視窗模式的!而我們的程式在回到視窗的時候對介面做了一點小手腳,造成了使用者操作的問題!

屁話一堆,那怎麼偵測現在當前是否開啟了 Tablet Mode 呢?

首先從 Windows message 分析:

當啟動或關閉 Tablet Mode 時候,程式會收到 WM_SETTINGCHANGE 的訊息,並且透過這個訊息告訴程式說:系統的 UserInteractionMode 這個設定改變囉!
從 WinRT 的  windows.ui.viewmanagement.h 中可以找到這個設定相關的物件,但是我們的程式不是 UAP,這條路似乎不通,只好另謀方法!『實際上這裡我是寫了一個測試程式,寫完在連結的時候找不到對應的 GUID 連結,估計大概是不知道哪裡設定錯誤了,以至於連結不到對的 Library,有鑑於也沒有 MSDN 可以查詢,暫時先跳過!但如果可以連結個到對應的 GUID,我'想物件應該是拿得出來的!』

利用 ProcessMonitor 觀察系統做了些什麼改變:

首先當然一開始會錄到一堆雜七雜八的變動,但我們知道微軟的 SHELL 應該跟 Explorer.EXE 比較有關係,所以在經過一陣大過濾後,終於將記錄降低至可以搜尋的狀態,也才終於看到一個非常面熟的值「TabletMode」,位置如下:
[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\ImmersiveShell]
"TabletMode"=dword:00000000

經過測試,這個鍵值的確可以拿來判斷目前使用者是否有啟用 Tablet Mode,但有個不幸缺點是它並不在訊息 WM_SETTINGCHANGE 接收到的時候就已經修改完畢了,所以在接收到 WM_SETTINGCHANGE 的時候去詢問它會拿到錯誤的值,如果要正確一點,可以透過 RegNotifyChangeKeyValue() 這個方法去監控這個鍵值,程式就可以反應使用者的選擇而改變介面的外觀,我相信雖然這是可行的辦法,但應該不是正解,如果有更正確的方法,麻煩請賜教,我會相當感激的!

好了,這就是目前的 Workaround 解法囉! 希望不會誤導大家!