如何在Windows窗体应用程序中检测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"); } } } 

原始问题

我有兴趣在我的Windows窗体应用程序中根据用户是否处于“平板电脑模式”(或不使用)使用新的Windows 10 Continuumfunction进行一些优化。

有关如何在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窗体等效?

要获得系统是否处于平板电脑模式,请查询系统度量标准ConvertibleSlateMode(未经测试,但它应该可以在XP之前正常工作):

 public static class TabletPCSupport { private static readonly int SM_CONVERTIBLESLATEMODE = 0x2003; private static readonly int SM_TABLETPC = 0x56; private Boolean isTabletPC = false; public Boolean SupportsTabletMode { get { return isTabletPC; }} public 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; } } 

( 这里有文件)

我到处都看过如何判断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) 

根据这篇文章 ,你不能听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,您应该使用一些WinRT来执行某些COM接口,以检查您是否在UserInteractionMode.Mouse(桌面)或UserInteractionMode.Touch(平板电脑)。

Com Interop的东西看起来相当棘手,但它似乎是唯一的方式,如果你在股票win32应用程序。