2015-07-01 13 views
26

AktualizacjaJak mogę wykryć, kiedy Window 10 wchodzi w tryb tabletu w aplikacji Windows Forms?

Choć nie jest to najbardziej eleganckie rozwiązanie, jedna metoda, która wydaje się działać to oglądać odpowiednią wartość rejestru. Oto przykład korzystania z usługi WMI. Z przyjemnością usłyszę od kogoś, czy jest lepsze rozwiązanie niż to.

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

oryginalne pytanie

Jestem zainteresowany poczynić pewne optymalizacje w moim Windows Forms aplikacji opartej o tym, czy użytkownik znajduje się w „trybie tabletu” (lub nie) za pomocą nowej funkcji systemu Windows 10 Continuum .

Istnieje kilka wskazówek, jak to zrobić w projekcie UWP pod numerem https://msdn.microsoft.com/en-us/library/windows/hardware/dn917883(v=vs.85).aspx (tzn. Sprawdź UserInteractionMode bieżącego widoku, aby zobaczyć, czy jest to UserInteractionMode.Mouse lub UserInteractionMode.Touch), jednak nie jestem pewien, czy lub jak mogę zrób to samo w Windows Forms.

Czy istnieje sposób, w jaki mogę wywołać niezbędne interfejsy API UWP z mojej aplikacji Windows Forms lub czy istnieje odpowiednik Windows Forms, którego mogę użyć?

+0

Masz powiadomienie w wiadomości wm_settingchange. –

+12

Powinieneś przenieść "Update" powyżej do odpowiedzi. –

+0

Więcej informacji znajdziesz tutaj https://social.msdn.microsoft.com/Forums/pl-PL/0610868f-8c30-4749-beac-510063b73913/about-windows-10-tablet-mode-api?forum=windowsuidevelopment –

Odpowiedz

6

Aby dostać się, czy system jest w trybie tabletu, czy nie, kwerendy systemu metrycznego ConvertibleSlateMode jak tak (nie testowane, ale powinien działać dobrze już w 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; 
    } 
} 

(Dokumentacja here)

1

Szukałem wszędzie, jak stwierdzić, czy system Windows 10 jest w trybie tabletu i tu jest najprostsze rozwiązanie znalazłem:

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) 
+1

I w ogóle nie widzę ustawień UIViewSettings i Windows.UI w mojej aplikacji. – tofutim

+0

Należy pamiętać, że będzie działać tylko wtedy, gdy tworzysz UWP. Oto link do MSDN, aby uzyskać więcej informacji: https://docs.microsoft.com/en-us/uwp/api/Windows.UI.ViewManagement.UIViewSettings#Windows_UI_ViewManagement_UIViewSettings_UserInteractionMode To nie będzie działać dla tradycyjnych aplikacji win32 . – Avik

1

Accordi ng do this article, nie można słuchać wiadomości WM_SETTINGCHANGE. Oto krótka próbka 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); 
     } 

Dla Windows 10 należy następnie wykonać pewne COM relacje z jakimś WinRT rzeczy, aby sprawdzić, czy jesteś w UserInteractionMode.Mouse (stacjonarnego) lub UserInteractionMode.Touch (tabletka).

Pliki COM Interop wyglądają raczej na skomplikowane, ale wydaje się, że to jedyny sposób, jeśli znajdujesz się w aplikacji na win32.

Powiązane problemy