更新
最も洗練されたソリューションではありませんが、機能していると思われる1つの方法は、関連するレジストリ値を監視することです。これは、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 10 Continuum機能を使用して、ユーザーが「タブレットモード」であるかどうかに基づいて、Windowsフォームアプリケーションでいくつかの最適化を行うことに興味があります。
UWPプロジェクトでこれを行う方法に関するガイダンスが https://msdn.Microsoft.com/en-us/library/windows/hardware/dn917883(v = vs.85).aspx にあります=(つまり、現在のビューのUserInteractionModeをチェックして、それがUserInteractionMode.MouseまたはUserInteractionMode.Touchであるかどうかを確認します)。
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 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;
}
}
(ドキュメント ここ )
私は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の場合、UserInteractionMode.Mouse(デスクトップ)またはUserInteractionMode.Touch(タブレット)にあるかどうかを確認するために、WinRTといくつかのCOMインターフェイスを実行する必要があります。
Com Interopのものはかなりトリッキーに見えますが、標準のwin32アプリを使用している場合は、これが唯一の方法のようです。