2012-11-09 22 views
9

पर विंडोज 8 टच समर्थन जोड़ना मेरे पास एक मौजूदा विंडोज फॉर्म डेस्कटॉप एप्लिकेशन लक्ष्यीकरण .NET Framework 4 है और इसमें विंडोज 8 टच समर्थन जोड़ना है।मौजूदा WinForms अनुप्रयोग

वर्तमान में प्रोग्राम विंडोज 8 में ठीक काम करता है, और मैं संभावित रूप से स्पर्श तत्वों पर इसे अधिक उपयोगकर्ता के अनुकूल बनाने के लिए कुछ तत्वों का आकार बदल सकता हूं। हालांकि, डेटाग्रिड्स पर चुटकी-टू-ज़ूम जैसे इशारे जोड़ना, और अन्य तत्वों के लिए समर्थन स्वाइप करना एक स्पर्श-केवल पर्यावरण में एप्लिकेशन को अधिक आधुनिक बनाने का एक लंबा सफर तय करेगा।

मैं विजुअल स्टूडियो 2012 में निवेश कर रहा हूं, जो मुझे .NET 4.5 और नई विंडोज 8 सुविधाओं को लक्षित करने देगा, लेकिन क्या किसी को भी ऐसे संसाधनों के बारे में पता है जो मेरे आवेदन को अपडेट करने में मेरी मदद करेंगे? मैं विशेष रूप से निम्नलिखित के बारे में चिंतित हूं:

  • मेरी गैर-स्पर्श विकास मशीन पर एप्लिकेशन की स्पर्श सुविधाओं का सीधे परीक्षण करने में असमर्थता। माइक्रोसॉफ्ट के सिम्युलेटर केवल मेट्रो ऐप का समर्थन करता है। मैंने सुना है कि स्पलैशटॉप जैसे टैबलेट ऐप्स मदद कर सकते हैं (मेरे पास एंड्रॉइड टैबलेट है), लेकिन इस विशेष परिदृश्य के लिए कुछ भी ठोस नहीं देखा है
  • चाहे जेनर्स WinForms अनुप्रयोगों पर भी समर्थित हों। क्या मुझे यह काम करने के लिए पूरे UI को WPF में अपग्रेड करना होगा? (अगर मैं इस मार्ग पर जाता हूं, तो मेरा मानना ​​है कि मैं विंडोज 7 को भी लक्षित कर सकता हूं, क्योंकि डब्ल्यूपीएफ 4 पर मल्टी-टच समर्थित है)
  • रनटाइम पर डिवाइस के स्पर्श समर्थन का पता लगाना और यूआई को उचित रूप से बदलना, टच मोड के समान माइक्रोसॉफ्ट के विंडोज आरटी ऑफिस एप्स पर सेटिंग। मैं सिर्फ नई सुविधाओं को जोड़ने के लिए परियोजना कांटा करने के लिए नहीं करना चाहती
  • स्पर्श बातचीत की
  • स्वचालित परीक्षण

यह किसी भी तरह से एक विस्तृत सूची नहीं है, लेकिन मैं वास्तव में उन लोगों से किसी भी सलाह की सराहना करेंगे, जो अतीत में एक समान अपग्रेड से संपर्क कर सकता है।

+0

आप लक्षित कर रहे हैं WinRT आप एक बार फिर से लिखने के लिए करने जा रहे हैं के बाद से WinRT कोई WinForms बराबर है। – mydogisbox

+1

@mydogisbox - मैं WinRT को लक्षित नहीं कर रहा हूं, बस स्पर्श का समर्थन करने के लिए मौजूदा WinForms डेस्कटॉप एप्लिकेशन को अपग्रेड करने में रूचि रखता हूं। मुझे अपने प्रश्न में यह स्पष्ट होना चाहिए था। इनपुट के लिए धन्यवाद। –

+0

[किसी भी व्यक्ति के लिए जो Windows 10 टचस्क्रीन का पूर्ण लाभ लेने के लिए पुराने WinForms ऐप को अपडेट करने की आवश्यकता है], वर्तमान लिंक के लिए [शेंग जियांग के उत्तर] (https://stackoverflow.com/a/25070182/199364) के तहत मेरी टिप्पणी देखें इशारा नमूना प्राप्त करने के लिए विंडोज 7 एसडीके ('चुटकी-ज़ूम' और 'घुमाएं')। सत्यापित है कि सी # समाधान माइक्रोसॉफ्ट सर्फेस प्रो (2017) पर विंडोज 10 प्रो चल रहा है। – ToolmakerSteve

उत्तर

6

रन-टाइम के समय उपकरण के स्पर्श समर्थन का पता लगा रहा है क्योंकि उपयोगकर्ता एक स्पर्श डिवाइस कभी भी कनेक्ट कर सकते हैं समस्याग्रस्त है। यदि आप टच डिवाइस कनेक्शन का पता लगाने के बाद फॉर्म का आकार बदलते हैं और डिवाइस का कनेक्शन स्थिर नहीं है तो आप एक ऐसे फॉर्म के साथ समाप्त हो सकते हैं जो स्वयं का आकार बदलता रहता है। सभी इनपुट के लिए बेहतर एक स्थिर इंटरफ़ेस है (उदाहरण के लिए एक छोटे मेनू बार के बजाय रिबन का उपयोग करना)। यदि आप वास्तव में स्पर्श डिवाइस का पता लगाना चाहते हैं, तो आप SM_DIGITIZER के साथ GetSystemMetrics को कॉल कर सकते हैं।

जेस्चर विंडोज फॉर्म (2005 में जमे हुए फीचर) में समर्थित नहीं हैं। हालांकि फॉर्म नियंत्रण अभी भी स्पर्श इनपुट का उपयोग कर सकते हैं क्योंकि डिफॉल्ट टच हैंडलर का अनुवाद माउस क्लिक पर स्पर्श करता है। यदि आप अपना खुद का स्पर्श हैंडलर रखना चाहते हैं, चूंकि टच इनपुट विंडोज संदेशों के रूप में भेजे जाते हैं, तो आप इशारा संदेशों को संभालने के लिए अपने फॉर्म या नियंत्रण के WndProc फ़ंक्शन को ओवरराइड कर सकते हैं। विंडोज 7 एसडीके में नमूना कोड के लिए Windows Touch Samples जांचें।

अपनी स्पर्श क्षमता के लिए परीक्षण कोड लिखने के लिए, आप स्पर्श इनपुट अनुकरण करने के लिए इंजेक्ट टच इनपुट को कॉल कर सकते हैं। एक पूर्ण नमूना Input: Touch injection sample पर पाया जा सकता है।मैं सिम्युलेटर को चलाने के लिए, पर जाएँ कर रहा हूँ -

+0

Winforms के स्पर्श को जोड़ने के लिए कैसे किया गया है __since का उत्तर दिया गया है :) अपने थीसिस में लाइव चेन खरीदें: http://portal.fke.utm.my/libraryfke/files/1387_LIEWHONCHIN2011.pdf, नीचे मेरा उत्तर देखें। – FastAl

+0

@FastAl - धन्यवाद, लेकिन थीसिस लेखक उसी विंडोज एपीआई का उपयोग करता है जो ऊपर उल्लिखित हैं। मुझे लगता है कि ऊपर सूचीबद्ध एमएसडीएन पेज बेहतर पृष्ठभूमि और उदाहरण प्रदान करता है। –

+1

@ डेवर, धन्यवाद, लेकिन क्या कोई उदाहरणों के लिए एक लिंक प्रदान कर सकता है? पूर्ण उदाहरणों की कमी के बारे में शिकायत करने के लिए लिंक किए गए पृष्ठों के नीचे 5+ उपयोगकर्ता टिप्पणियां नोट करें! मैं _really_ चाहता था कि वह पृष्ठ सी # उदाहरण के लिए एक पूर्ण डाउनलोड करने योग्य। एसएलएन फ़ाइल प्रदान करे - _soooo_ बहुत कुछ गायब है और मुझे पता है कि माइक्रोसॉफ्ट को शायद एक होना था- यहां तक ​​कि स्क्रीनशॉट भी हैं! मुझे उम्मीद है कि मैं इसे याद करूँगा। (नोट-डाउनलोड? आईडी = 6450 एक उपयोगकर्ता टिप्पणी द्वारा वर्णित मृत है)। उस पर कमी, Liew का पूरा नेट कोड अच्छा था (सी # उपयोगकर्ता telerik.com पर परिवर्तित कर सकते हैं)। – FastAl

2

टच कम या ज्यादा "बस काम करना चाहिए", लेकिन निश्चित रूप से, बटनों को बड़ा होना चाहिए आदि। बस स्पर्श करने की तुलना में अधिक जटिल संकेतों के लिए here देखें।

6

आप घटक से TouchToolkit for WinForms का उपयोग कर सकते हैं। हालांकि मुझे लगता है कि इन घटकों का उपयोग करने के लिए आपको अपने आवेदन को फिर से लिखना होगा।

enter image description here

+0

ने बकाया पुरस्कार दिया क्योंकि यह सबसे अच्छा जवाब था। धन्यवाद! – SSS

+0

टचटूलकिट लिंक अब परिणाम "404 नहीं मिला"। – ToolmakerSteve

5

पर टिप्पणी के बारे में "। असमर्थता सीधे मेरी गैर-स्पर्श विकास मशीन पर आवेदन के स्पर्श सुविधाओं का परीक्षण करने माइक्रोसॉफ्ट के सिम्युलेटर केवल मेट्रो क्षुधा समर्थन करने के लिए लगता है" सिम्युलेटर में डेस्कटॉप और टच इनपुट सिमुलेट करते समय किसी ऐप को चलाएं - जिसमें WinForms ऐप्स शामिल हैं।

चूंकि WinForms WinAPI के मूल यूआई एपीआई पर सिर्फ एक रैपर है - आप टच एपीआई का उपयोग करने के लिए पी/इनवॉक का उपयोग कर सकते हैं जो मुझे लगता है कि विस्टा/विंडोज 7 टाइमफ्रेम के आसपास जोड़ा गया था। मुख्य रूप से WM_TOUCH और WM_GESTURE संदेश। पी/Invoking और protected override void WndProc(ref Message m) का उपयोग करने के लिए बहुत सारे उदाहरण हैं जो मुख्य चीजें हैं जिन्हें आपको स्पर्श को संभालने की आवश्यकता होगी। इसके अलावा - टच इनपुट डिफ़ॉल्ट रूप से माउस ईवेंट पर प्रचारित होते हैं जब स्पर्श के रूप में नहीं संभाले जाते हैं, इसलिए बहुत सी चीजें बस काम करती हैं। WinForms को

1

जोड़ना इशारा समर्थन - यहाँ हल:

http://portal.fke.utm.my/libraryfke/files/1387_LIEWHONCHIN2011.pdf

'Imports System.Security.Permissions 
'Imports System.Runtime.InteropServices 


    Private first_point As New Point() 
    Private second_point As New Point() 
    Private iArguments As Integer = 0 
    Private Const ULL_ARGUMENTS_BIT_MASK As Int64 = &HFFFFFFFFL 
    Private Const WM_GESTURENOTIFY As Integer = &H11A 
    Private Const WM_GESTURE As Integer = &H119 
    Private Const GC_ALLGESTURES As Integer = &H1 
    Private Const GID_BEGIN As Integer = 1 
    Private Const GID_END As Integer = 2 
    Private Const GID_ZOOM As Integer = 3 
    Private Const GID_PAN As Integer = 4 
    Private Const GID_ROTATE As Integer = 5 
    Private Const GID_TWOFINGERTAP As Integer = 6 
    Private Const GID_PRESSANDTAP As Integer = 7 
    Private Const GF_BEGIN As Integer = &H1 
    Private Const GF_INERTIA As Integer = &H2 
    Private Const GF_END As Integer = &H4 
    Private Structure GESTURECONFIG 
    Public dwID As Integer 
    Public dwWant As Integer 
    Public dwBlock As Integer 
    End Structure 
    Private Structure POINTS 
    Public x As Short 
    Public y As Short 
    End Structure 
    Private Structure GESTUREINFO 
    Public cbSize As Integer 
    Public dwFlags As Integer 
    Public dwID As Integer 
    Public hwndTarget As IntPtr 
    <MarshalAs(UnmanagedType.Struct)> 
    Friend ptsLocation As POINTS 
    Public dwInstanceID As Integer 
    Public dwSequenceID As Integer 
    Public ullArguments As Int64 
    Public cbExtraArgs As Integer 
    End Structure 
    <DllImport("user32")> _ 
    Private Shared Function SetGestureConfig(ByVal hWnd As IntPtr, ByVal dwReserved As Integer, ByVal cIDs As Integer, ByRef pGestureConfig As GESTURECONFIG, ByVal cbSize As Integer) As <MarshalAs(UnmanagedType.Bool)> Boolean 
    End Function 
    <DllImport("user32")> 
    Private Shared Function GetGestureInfo(ByVal hGestureInfo As IntPtr, ByRef pGestureInfo As GESTUREINFO) As <MarshalAs(UnmanagedType.Bool)> Boolean 
    End Function 
    Private _gestureConfigSize As Integer 
    Private _gestureInfoSize As Integer 
    <SecurityPermission(SecurityAction.Demand)> 
    Private Sub SetupStructSizes() 
    _gestureConfigSize = Marshal.SizeOf(New GESTURECONFIG()) 
    _gestureInfoSize = Marshal.SizeOf(New GESTUREINFO()) 
    End Sub 
    <PermissionSet(SecurityAction.Demand, Name:="FullTrust")> 
    Protected Overrides Sub WndProc(ByRef m As Message) 
    Dim handled As Boolean 
    Select Case m.Msg 
     Case WM_GESTURENOTIFY 
     Dim gc As New GESTURECONFIG() 
     gc.dwID = 0 
     gc.dwWant = GC_ALLGESTURES 
     gc.dwBlock = 0 
     Dim bResult As Boolean = SetGestureConfig(Handle, 0, 1, gc, _gestureConfigSize) 
     If Not bResult Then 
      Throw New Exception("Error in execution of SetGestureConfig") 
     End If 
     handled = True 
     Case WM_GESTURE 
     handled = DecodeGesture(m) 
     Case Else 
     handled = False 
    End Select 
    MyBase.WndProc(m) 
    If handled Then 
     Try 
     m.Result = New IntPtr(1) 
     Catch excep As Exception 
     Debug.Print("Could not allocate result ptr") 
     Debug.Print(excep.ToString()) 
     End Try 
    End If 
    End Sub 
    Private Function DecodeGesture(ByRef m As Message) As Boolean 
    Dim gi As GESTUREINFO 
    Try 
     gi = New GESTUREINFO() 
    Catch excep As Exception 
     Debug.Print("Could not allocate resources to decode gesture") 
     Debug.Print(excep.ToString()) 
     Return False 
    End Try 
    gi.cbSize = _gestureInfoSize 
    If Not GetGestureInfo(m.LParam, gi) Then 
     Return False 
    End If 
    Select Case gi.dwID 
     Case GID_BEGIN, GID_END 
     Case GID_TWOFINGERTAP 
     'Receipt.Show() 
     'Invalidate() 
     Case GID_ZOOM 
     Select Case gi.dwFlags 
      Case GF_BEGIN 
      iArguments = CInt(Fix(gi.ullArguments And 
      ULL_ARGUMENTS_BIT_MASK)) 
      first_point.X = gi.ptsLocation.x 
      first_point.Y = gi.ptsLocation.y 
      first_point = PointToClient(first_point) 
      Case Else 
      second_point.X = gi.ptsLocation.x 
      second_point.Y = gi.ptsLocation.y 
      second_point = PointToClient(second_point) 
      RaiseEvent GestureHappened(Me, New GestureEventArgs With {.Operation = Gestures.Pan, .FirstPoint = first_point, .SecondPoint = second_point}) 
      'Invalidate() 
      'MsgBox("zoom") 
     End Select 
     Case GID_PAN 
     Select Case gi.dwFlags 
      Case GF_BEGIN 
      first_point.X = gi.ptsLocation.x 
      first_point.Y = gi.ptsLocation.y 
      first_point = PointToClient(first_point) 
      Case Else 
      second_point.X = gi.ptsLocation.x 
      second_point.Y = gi.ptsLocation.y 
      second_point = PointToClient(second_point) 
      RaiseEvent GestureHappened(Me, New GestureEventArgs With {.Operation = Gestures.Pan, .FirstPoint = first_point, .SecondPoint = second_point}) 
      'Invalidate() 
      'MsgBox("pan") 
     End Select 
     Case GID_PRESSANDTAP 
     'If gi.dwFlags = GF_BEGIN Then 
     ' Invalidate() 
     'End If 
     Case GID_ROTATE 
     'Select Case gi.dwFlags 
     ' Case GF_BEGIN 
     ' iArguments = 0 
     ' Case Else 
     ' first_point.X = gi.ptsLocation.x 
     ' first_point.Y = gi.ptsLocation.y 
     ' first_point = PointToClient(first_point) 
     ' Invalidate() 
     'End Select 
    End Select 
    Return True 
    End Function 


    Public Enum Gestures 
    Pan 
    Zoom 
    End Enum 

    Public Class GestureEventArgs 
    Inherits EventArgs 
    Public Property Operation As Gestures 
    Public Property FirstPoint As Point 
    Public Property SecondPoint As Point 
    End Class 

    Public Event GestureHappened(sender As Object, e As GestureEventArgs) 
+0

दुर्भाग्यवश, पीडीएफ लिंक मर चुका है। आप उपरोक्त कोड का उपयोग कैसे करते हैं? मेरा पहला अनुमान है कि उन सभी पंक्तियों को कक्षा परिभाषा के अंदर रखना है। फिर क्या? [मैं पुराने WinForms ऐप में चुटकी-ज़ूम जोड़ने की कोशिश कर रहा हूं।] – ToolmakerSteve

+0

कोई बात नहीं। [शेंग जियांग के उत्तर] के तहत मेरी टिप्पणी देखें (https: // stackoverflow।कॉम/ए/25070182/199364) - विंडोज 7 एसडीके टच नमूने में एक पूर्ण सी # समाधान शामिल है, जो चुटकी-ज़ूम लागू करता है और जेस्चर घुमाता है। यह नमूना माइक्रोसॉफ्ट सर्फेस प्रो (2017) पर विंडोज 10 चला रहा है, इसलिए मेरे पास पुराने WinForms ऐप को अपडेट करने की आवश्यकता है :) – ToolmakerSteve