如何在Windows窗体应用程序中检测Windows 10何时进入平板电脑模式?

Ada*_*ala 30 .net c# windows winforms windows-10

更新

虽然不是最优雅的解决方案,但似乎有效的一种方法是观察相关的注册表值.这是使用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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

原始问题

我有兴趣根据用户是否使用新的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窗体中执行相同操作.

我是否可以通过Windows窗体应用程序调用必要的UWP API,或者我可以使用哪些Windows窗体等效?

小智 10

要获得系统是否处于平板电脑模式,请查询系统度量标准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;
   }
}
Run Code Online (Sandbox Code Playgroud)

(这里的文件)