wake-up-neo.com

Wie kann ich feststellen, wenn Windows 10 in einer Windows Forms-Anwendung in den Tablet-Modus wechselt?

Update

Obwohl dies nicht die eleganteste Lösung ist, scheint eine Methode zu funktionieren, den entsprechenden Registrierungswert zu überwachen. Hier ist ein Beispiel mit WMI, um dies zu tun. Ich würde mich freuen, von jemandem zu hören, wenn es eine bessere Lösung als diese gibt.

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");
        }
    }
}

Ursprüngliche Frage

Ich bin daran interessiert, einige Optimierungen in meiner Windows Forms-Anwendung vorzunehmen, je nachdem, ob sich ein Benutzer im "Tablet-Modus" befindet (oder nicht) und die neue Windows 10 Continuum-Funktion verwendet.

Anleitungen dazu finden Sie in einem UWP-Projekt unter https://msdn.Microsoft.com/en-us/library/windows/hardware/dn917883(v=vs.85).aspx (dh Überprüfen Sie den UserInteractionMode der aktuellen Ansicht, um zu sehen, ob es UserInteractionMode.Mouse oder UserInteractionMode.Touch ist. Ich bin mir jedoch nicht sicher, ob und wie ich dies in Windows Forms tun kann.

Gibt es eine Möglichkeit, die erforderlichen UWP-APIs von meiner Windows Forms-Anwendung aus aufzurufen, oder gibt es ein Windows Forms-Äquivalent, das ich verwenden kann?

28
Adam Stiskala

Um festzustellen, ob sich das System im Tablet-Modus befindet oder nicht, fragen Sie die Systemkennzahl ConvertibleSlateMode wie folgt ab (nicht getestet, sollte jedoch bis XP funktionieren):

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;
   }
}

(Dokumentation hier )

8
Cheese Lover

Ich habe überall gesucht, um herauszufinden, ob Windows 10 im Tablet-Modus ist. Hier ist die einfachste Lösung, die ich gefunden habe:

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)
2
Gary Shaw

Laut diesem Artikel können Sie keine WM_SETTINGCHANGE-Nachricht hören. Hier ist eine kurze c # Probe:

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);
        }

Unter Windows 10 sollten Sie dann einige COM-Schnittstellen mit einigen WinRT-Elementen ausführen, um zu überprüfen, ob Sie sich in UserInteractionMode.Mouse (Desktop) oder UserInteractionMode.Touch (Tablet) befinden.

Das Com-Interop-Zeug sieht ziemlich knifflig aus, aber es scheint der einzige Weg zu sein, wenn Sie sich in einer Win32-App befinden.

1
Usul