Windows 10およびWindows 8のマウスとタッチスクリーンの制御モード

このプロジェクトは、Windows 8(.1)を実行するラップトップトランスの動作モード(タブレットモードまたはラップトップモード)の定義と、Windows 10のマウスとタッチスクリーンを使用する新しい制御モードを示します。マウスとタッチスクリーンを使用する制御モードも同様です。タブレットモードとラップトップモードがありますが、Windows 10ではユーザーが手動でモードを切り替えることができましたが、Windows 8ではモードはデバイスの物理的な状態に応じてのみ切り替わります。 そのため、Windows 10のユーザーは、トランスフォーマーではないデバイスでも、タッチコントロール用に設計された高度なグラフィカルユーザーインターフェイスを使用できます。タッチスクリーンを持つことが重要です。 この新しい機能は、新しいUWP(ユニバーサルWindowsプラットフォーム)APIに基づいています 。 Windows 10でこの機能を使用するには、Windows 8用に設計されたアプリケーションに数行のコードを追加する必要があります。このドキュメントでは、Windows 10でWRL(Windows C ++ C ++テンプレートライブラリ)を使用してUWP APIを使用するWin32アプリケーションの開発を示しますUWPアプリケーション。 サンプルのMicrosoftコードを参照してください。



必要条件



  1. Windows 10
  2. Visual Studio *2015。VisualStudio 2013には新しいAPIがありません


Windows 10のマウスおよびタッチスクリーンコントロールの説明



手動設定

画面の右端から中央にスワイプして、サポートセンター(Windows 8のチャームメニュー)を開きます。

「タブレットモード」ボタンをタッチして、タッチコントロールモードとマウスコントロールモードを切り替えます。







機器の選択

トランスフォーマーは物理状態の変化を検出すると、OSに通知します。

OSはユーザーに確認を求めます。 ユーザーが確認すると、OSはモードを切り替えます。







確認するには、[設定]-> [システム]-> [タブレットモード]セクションに移動し、[モードを切り替える前に常に許可を求める]チェックボックスをオンにします。



サンプルアプリケーション



OSによっては、ダイアログベースのサンプルアプリケーションで次のことが発生します。







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シェルを呼び出してステータスを確認できます。



All Articles