2015-07-01 7 views
26

अद्यतनविंडोज़ फॉर्म एप्लिकेशन में विंडो 10 टैबलेट मोड में प्रवेश करते समय मुझे कैसे पता चलेगा?

नहीं सबसे सुरुचिपूर्ण समाधान, एक विधि काम करने के लिए लगता है कि प्रासंगिक रजिस्ट्री मान को देखने के लिए है है। ऐसा करने के लिए 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 सातत्य सुविधा का उपयोग कर ।

कैसे https://msdn.microsoft.com/en-us/library/windows/hardware/dn917883(v=vs.85).aspx पर एक UWP परियोजना में यह करने के लिए पर कुछ मार्गदर्शन नहीं है (यानी अगर यह UserInteractionMode.Mouse या UserInteractionMode.Touch है देखने के लिए वर्तमान दृश्य के UserInteractionMode जाँच), हालांकि मुझे यकीन है कि नहीं कर रहा हूँ अगर या मैं कैसे कर सकते हैं विंडोज फॉर्म में ऐसा ही करें।

क्या कोई तरीका है कि मैं अपने विंडोज़ फॉर्म एप्लिकेशन से आवश्यक यूडब्ल्यूपी एपीआई कॉल कर सकता हूं, या क्या कुछ विंडोज़ फॉर्म समकक्ष मैं उपयोग कर सकता हूं?

+0

आपके पास wm_settingchange संदेश में अधिसूचना है। –

+12

आपको अपने "अपडेट" को उत्तर में ले जाना चाहिए। –

+0

उस पर और अधिक https://social.msdn.microsoft.com/Forums/en-US/0610868f-8c30-4749-beac-510063b73913/about-windows-10-tablet-mode-api?forum=windowsuidevelopment –

उत्तर

6

, चाहे प्रणाली गोली मोड में है प्राप्त करने के लिए है या नहीं की तरह तो प्रणाली मीट्रिक 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; 
    } 
} 

(प्रलेखन here)

1

मैं हर जगह है, तो 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) 
+1

I मेरे ऐप में UIViewSettings और Windows.UI को बिल्कुल न देखें। – tofutim

+0

ध्यान रखें यह केवल तभी काम करेगा जब आप यूडब्ल्यूपी बना रहे हों। यहाँ अधिक जानकारी के लिए MSDN के लिए लिंक है: https://docs.microsoft.com/en-us/uwp/api/Windows.UI.ViewManagement.UIViewSettings#Windows_UI_ViewManagement_UIViewSettings_UserInteractionMode इस पारंपरिक Win32 अनुप्रयोग के लिए काम नहीं करेगा । – Avik

1

Accordi this article पर, आप WM_SETTINGCHANGE संदेश सुन नहीं सकते। यहाँ एक छोटी सी # नमूना है:

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 सामान के साथ Interfacing, प्रदर्शन यदि आप UserInteractionMode.Mouse (डेस्कटॉप) या UserInteractionMode.Touch (टेबलेट) में हैं जाँच करने के लिए करना चाहिए।

कॉम इंटरऑप सामान अपेक्षाकृत मुश्किल लग रहा है लेकिन यह एकमात्र तरीका प्रतीत होता है यदि आप स्टॉक Win32 ऐप में हैं।

संबंधित मुद्दे