更新
虽然不是最好的解决方案,但似乎有效的一种方法是观察相关的注册表值。这是使用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 Continuum功能进行一些优化。
有关如何在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窗体等效?
发布于 2019-01-03 13:55:35
要获得系统是否处于平板电脑模式,请查询系统度量标准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;
}
}
(这里有文件)
发布于 2019-01-03 14:58:54
根据这篇文章,你不能听取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应用程序)。
https://stackoverflow.com/questions/-100003088
复制相似问题