web-dev-qa-db-ja.com

Windows 10がWindowsフォームアプリケーションでタブレットモードになったことをどのように検出できますか?

更新

最も洗練されたソリューションではありませんが、機能していると思われる1つの方法は、関連するレジストリ値を監視することです。これは、WMIを使用してこれを行う例です。これより良い解決策があれば、誰かから連絡をいただければ幸いです。

using System;
using System.Management;
using System.Security.Principal;
using System.Windows.Forms;
using Microsoft.Win32;

public partial class MainForm : Form
{
    public MainForm()
    {
        this.InitializeComponent();
        this.UpdateModeFromRegistry();

        var currentUser = WindowsIdentity.GetCurrent();
        if (currentUser != null && currentUser.User != null)
        {
            var wqlEventQuery = new EventQuery(string.Format(@"SELECT * FROM RegistryValueChangeEvent WHERE Hive='HKEY_USERS' AND KeyPath='{0}\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\ImmersiveShell' AND ValueName='TabletMode'", currentUser.User.Value));
            var managementEventWatcher = new ManagementEventWatcher(wqlEventQuery);
            managementEventWatcher.EventArrived += this.ManagementEventWatcher_EventArrived;
            managementEventWatcher.Start();
        }
    }

    private void ManagementEventWatcher_EventArrived(object sender, EventArrivedEventArgs e)
    {
        this.UpdateModeFromRegistry();
    }

    private void UpdateModeFromRegistry()
    {
        var tabletMode = (int)Registry.GetValue("HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\ImmersiveShell", "TabletMode", 0);
        if (tabletMode == 1)
        {
            Console.Write(@"Tablet mode is enabled");
        }
        else
        {
            Console.Write(@"Tablet mode is disabled");
        }
    }
}

元の質問

新しいWindows 10 Continuum機能を使用して、ユーザーが「タブレットモード」であるかどうかに基づいて、Windowsフォームアプリケーションでいくつかの最適化を行うことに興味があります。

UWPプロジェクトでこれを行う方法に関するガイダンスが https://msdn.Microsoft.com/en-us/library/windows/hardware/dn917883(v = vs.85).aspx にあります=(つまり、現在のビューのUserInteractionModeをチェックして、それがUserInteractionMode.MouseまたはUserInteractionMode.Touchであるかどうかを確認します)。

Windowsフォームアプリケーションから必要なUWP APIを呼び出す方法はありますか、それとも同等のWindowsフォームの同等機能を使用できますか?

30
Adam Stiskala

システムがタブレットモードかどうかを確認するには、システムメトリックConvertibleSlateModeを次のようにクエリします(テストされていませんが、XPまでさかのぼって正常に動作するはずです)。

public static class TabletPCSupport
{
   private static readonly int SM_CONVERTIBLESLATEMODE = 0x2003;
   private static readonly int SM_TABLETPC = 0x56;

   private static Boolean isTabletPC = false;

   public static Boolean SupportsTabletMode { get { return isTabletPC; }}

   public static Boolean IsTabletMode 
   {
       get
       {
           return QueryTabletMode();
       }
   }

   static TabletPCSupport ()
   {
        isTabletPC = (GetSystemMetrics(SM_TABLETPC) != 0);
   }

   [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto, EntryPoint = "GetSystemMetrics")]
   private static extern int GetSystemMetrics (int nIndex);

   private static Boolean QueryTabletMode ()
   {
       int state = GetSystemMetrics(SM_CONVERTIBLESLATEMODE);
       return (state == 0) && isTabletPC;
   }
}

(ドキュメント ここ

10
Cheese Lover

私はWindows 10がタブレットモードであるかどうかを見分ける方法をどこでも探しましたが、ここで私が見つけた最も簡単な解決策を示します。

bool bIsTabletMode = false;

var uiMode = UIViewSettings.GetForCurrentView().UserInteractionMode;

if (uiMode == Windows.UI.ViewManagement.UserInteractionMode.Touch)

 bIsTabletMode = true;

else

 bIsTabletMode = false;


// (Could also compare with .Mouse instead of .Touch)
3
Gary Shaw

この記事 によると、WM_SETTINGCHANGEメッセージを聞くことができません。以下は短いc#サンプルです。

protected override void WndProc(ref Message m)
        {

            const int WM_WININICHANGE = 0x001A,
                WM_SETTINGCHANGE = WM_WININICHANGE;

            if (m.Msg == WM_SETTINGCHANGE)
            {
                if (Marshal.PtrToStringUni(m.LParam) == "UserInteractionMode")
                {
                    MessageBox.Show(Environment.OSVersion.VersionString);
                }
            }

            base.WndProc(ref m);
        }

Windows 10の場合、UserInteractionMode.Mouse(デスクトップ)またはUserInteractionMode.Touch(タブレット)にあるかどうかを確認するために、WinRTといくつかのCOMインターフェイスを実行する必要があります。

Com Interopのものはかなりトリッキーに見えますが、標準のwin32アプリを使用している場合は、これが唯一の方法のようです。

1
Usul