更新
虽然不是最优雅的解决scheme,似乎工作的一种方法是观察相关的registry值。 以下是使用WMI执行此操作的示例。 如果有比这更好的解决scheme,我很乐意听到任何人的消息。
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 Continuumfunction的“平板模式”(或不使用)在Windows窗体应用程序中进行一些优化。
从任务pipe理器启动进程并隐藏命令行参数
exception在非英文操作系统上通过SpecialFolder目录recursion
当父窗口最小化时如何防止子窗口的最小化
如何使.NET应用程序“大地址感知”?
wpf窗口位置的问题
有一些关于如何在UWP项目中执行此操作的指导, url为:https ://msdn.microsoft.com/en-us/library/windows/hardware/dn917883( v= vs.85).aspx(即检查当前视图UserInteractionMode来查看是否UserInteractionMode.Mouse或UserInteractionMode.Touch),但是我不知道是否或如何在Windows窗体中做同样的事情。
有没有什么办法可以从我的Windows窗体应用程序调用必要的UWP API,还是有一些Windows窗体的等价物,我可以使用?
我如何使用“networking服务”帐户启动控制台应用程序
DoD CAC身份validation – .NET C#的客户端证书问题,Windows Server 2008 R2,IIS 7.5
服务在手动停止后自动重新启动
在Windows环境中使用Etsy的StatsD
要确定系统是否处于平板电脑模式,请像这样查询系统指标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(desktop)还是UserInteractionMode.Touch(tablet)。
COM互操作的东西看起来相当棘手,但它似乎是唯一的方法,如果你在一个股票的Win32应用程序。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。