必要条件
- Windows 10
- Visual Studio *2015。VisualStudio 2013には新しいAPIがありません
Windows 10のマウスおよびタッチスクリーンコントロールの説明
手動設定
画面の右端から中央にスワイプして、サポートセンター(Windows 8のチャームメニュー)を開きます。
「タブレットモード」ボタンをタッチして、タッチコントロールモードとマウスコントロールモードを切り替えます。
機器の選択
トランスフォーマーは物理状態の変化を検出すると、OSに通知します。
OSはユーザーに確認を求めます。 ユーザーが確認すると、OSはモードを切り替えます。
確認するには、[設定]-> [システム]-> [タブレットモード]セクションに移動し、[モードを切り替える前に常に許可を求める]チェックボックスをオンにします。
サンプルアプリケーション
OSによっては、ダイアログベースのサンプルアプリケーションで次のことが発生します。
- Windows 10:手動または自動で切り替えると、タッチ/マウス制御のイベントとこのイベントの時間が記録されます。
- Windows 8:物理状態イベントとその時間(タブレットモード/ラップトップモード)が記録されます。
Windows 8では、物理状態が変化するとWM_SETTINGCHANGEメッセージ(lParam ==“ ConvertibleSlateMode”)が送信され、Windows 10では、 WM_SETTINGCHANGE(lParam ==“ UserInteractionMode”)がトップレベルウィンドウに送信されます。 この場合、前のメッセージも送信されます。 アプリケーションはOSバージョンを判別し、それに応じて1つまたは別のコードを選択する必要があります。 それ以外の場合、Windows 10のアプリケーションは上記のメッセージに2回応答します。
void CMy2in1LogDlg::OnSettingChange(UINT uFlags, LPCTSTR lpszSection) { CDialogEx::OnSettingChange(uFlags, lpszSection); // TODO: Add your message handler code here if (lpszSection != NULL) { CString strMsg = CString(lpszSection); if (m_dwVersionMajor < 10 && strMsg == _T("ConvertibleSlateMode")) { CString strTime; GetTime(strTime); BOOL bSlate = GetSystemMetrics(SM_CONVERTIBLESLATEMODE) == 0; CString strMsg = CString(bSlate ? _T("Slate Mode") : _T("Clamshell Mode")); m_ctrlEvents.InsertItem(m_iEvent, strTime); m_ctrlEvents.SetItemText(m_iEvent, 1, strMsg); m_iEvent++; return; } if (m_dwVersionMajor >= 10 && strMsg == _T("UserInteractionMode")) { CString strTime, strMsg; GetTime(strTime); int mode; if (GetUserInteractionMode(mode) == S_OK) { if (mode == UserInteractionMode_Mouse) strMsg.Format(_T("Mouse Mode")); else if (mode == UserInteractionMode_Touch) strMsg.Format(_T("Touch Mode")); m_ctrlEvents.InsertItem(m_iEvent, strTime); m_ctrlEvents.SetItemText(m_iEvent, 1, strMsg); m_iEvent++; } } } }
アプリケーションはメッセージを受信した後、現在の状態をポーリングします。これは、メッセージがOSにモードの変更のみを通知し、現在の状態については通知しないためです。 新しい状態を直接照会できるWin32 APIはありませんが、次のコードスニペットに示すように、WRLを使用してWin32アプリケーションからWindows RTコンポーネントにアクセスできます。
HRESULT CMy2in1LogDlg::GetUserInteractionMode(int & iMode) { ComPtr<IUIViewSettingsInterop> uiViewSettingsInterop; HRESULT hr = GetActivationFactory( HStringReference(RuntimeClass_Windows_UI_ViewManagement_UIViewSettings).Get(), &uiViewSettingsInterop); if (SUCCEEDED(hr)) { ComPtr<IUIViewSettings> uiViewSettings; hr = uiViewSettingsInterop->GetForWindow(this->m_hWnd, IID_PPV_ARGS(&uiViewSettings)); if (SUCCEEDED(hr)) { UserInteractionMode mode; hr = uiViewSettings->get_UserInteractionMode(&mode); if (SUCCEEDED(hr)) { switch (mode) { case UserInteractionMode_Mouse: iMode = UserInteractionMode_Mouse; break; case UserInteractionMode_Touch: iMode = UserInteractionMode_Touch; break; default: break; } } } } return S_OK; }
結論とその他の機能
このコードサンプルは、Win32を使用してWindows 8 / 8.1およびWindows 10でトランスフォーマーの動作モードを検出する実装を示しています。 Windows 8を実行しているWindowsストアアプリでは、トランスフォーマーイベントを検出できませんでした。 Windows 10はUWP APIをサポートしているため、ユニバーサルアプリケーションはトランスフォーマーの機能を使用できます。 同様のWin32 APIを使用する代わりに、Win32アプリケーションからUWP APIを使用する方法が提示されます。 UWP APIにはこのイベントに関する特別な通知がないことに注意してください。 ウィンドウのサイズ変更イベントを使用してから、現在の状態を確認します。 状態が保存された状態と異なる場合、変更されたと見なされます。 Win32メッセージの使用が不便な場合(たとえば、Java *アプリケーション)、Javaでウィンドウサイズ変更イベントを使用し、JNIシェルを呼び出してステータスを確認できます。