首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何检测Windows 10何时进入Windows窗体应用程序中的平板模式?

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

Stack Overflow用户
提问于 2015-07-01 06:05:36
回答 3查看 13.7K关注 0票数 32

更新

虽然不是最优雅的解决方案,但似乎可行的一种方法是查看相关的注册表值。下面是一个使用WMI进行此操作的示例。如果有比这更好的解决方案的话,我很高兴听到任何人的消息。

代码语言:javascript
运行
复制
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");
        }
    }
}

原始问题

我感兴趣的是,根据用户是否处于"Tablet模式“(是否处于”Tablet模式“),使用新的Windows 10连续功能在我的Windows窗体应用程序中进行一些优化。

https://msdn.microsoft.com/en-us/library/windows/hardware/dn917883(v=vs.85).aspx的UWP项目中,有一些关于如何做到这一点的指导(即查看当前视图的UserInteractionMode以确定它是UserInteractionMode.Mouse还是UserInteractionMode.Touch),但是我不确定在Windows中是否或如何可以这样做。

有什么方法可以从我的Windows窗体应用程序中调用必要的UWP API吗?还是我可以使用一些与Windows窗体相当的API?

EN

回答 3

Stack Overflow用户

发布于 2015-09-05 21:18:26

要获得系统是否处于tablet模式,请像这样查询系统度量ConvertibleSlateMode (没有测试,但应该可以追溯到XP):

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2016-01-16 06:53:48

我到处寻找如何判断Windows 10是否处于平板模式,下面是我找到的最简单的解决方案:

代码语言:javascript
运行
复制
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)
票数 4
EN

Stack Overflow用户

发布于 2017-03-15 13:35:59

根据这篇文章,你不能听WM_SETTINGCHANGE消息。下面是一个简短的c#示例:

代码语言:javascript
运行
复制
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 (平板电脑)。

看起来相当棘手,但如果你是股票win32应用程序的话,这似乎是唯一的方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31153664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档