2013-05-23 7 views
6

का उपयोग कर मेरे पास एक WPF C# अनुप्रयोग है। मेरे पास दोहरी स्क्रीन हैं, और मैं स्क्रीन पर से किसी एक पर माउस इवेंट को रद्द करना चाहता हूं, क्योंकि यह एक टच स्क्रीन है और जब भी कोई उपयोगकर्ता इसे दबाता है तो यह मुख्य स्क्रीन पर ध्यान केंद्रित करता है। मैं केवल उपयोगकर्ता से डेटा मांगते समय स्पर्श को सक्षम करना चाहता हूं, और उसके बाद इसे अवरुद्ध करना चाहता हूं।टच स्क्रीन माउस डिवाइस इवेंट्स को अक्षम करना setwindowshookex (user32.dll)

मुझे user32.dll का उपयोग कर एप्लिकेशन हुक के बारे में कुछ अच्छे उदाहरण मिल गए हैं, जो मुझे डिवाइस इनपुट को पकड़ने में मदद करता है। एक उदाहरण यहां दिखाता है: http://www.pinvoke.net/default.aspx/user32.setwindowshookex। और दूसरा, यह माउस इवेंट्स के लिए अधिक उपयुक्त है यहां दिखाया जा सकता है: How to avoid mouse move on Touch

मेरी समस्या डिवाइस इनपुट को पकड़ने के साथ नहीं है, लेकिन इसे अक्षम करने के साथ। ऊपर दिया गया पहला उदाहरण दिखाता है कि कुंजीपटल इनपुट कैसे पकड़ें और कुंजी दबाए रखें, लेकिन इसे अक्षम नहीं करते हैं।

दूसरा उदाहरण भी काम नहीं करता है। यह माउस घटनाओं, नियमित यूएसबी-माउस डिवाइस और टच स्क्रीन डिवाइस दोनों को पकड़ता है। मैं बता सकता हूं कि कौन सा है, लेकिन मैं टच-स्क्रीन डिवाइस को रद्द नहीं कर सकता। उदाहरण में, टच डिवाइस के लिए new IntPtr(1); वापस कर दिया गया है। यह डिवाइस इनपुट के लिए कुछ भी नहीं करता है।

दूसरी ओर, जब मैं विपरीत करता हूं, जिसका मतलब है कि नया IntPtr (1) लौटा रहा है; प्रत्येक माउस इवेंट पर टच इवेंट, ऐसा लगता है कि मेरा नियमित माउस बिल्कुल नहीं चलता है (जबकि टच डिवाइस माउस चलता है)।

इस विधि में मदद कर सकते नियमित माउस, लेकिन नहीं स्पर्श माउस, कोई कोड के रूप में मैं लौट इस माउस (मैं इस माउस खोजने के लिए और एक कोड को वापस कर अवरुद्ध कर देगा ब्लॉक, मुझे लगता है कि कई बार, कोड, हालांकि कुछ नहीं करता है की जाँच की)।

static readonly LowLevelMouseProc hookCallback = HookCallback; 
     static IntPtr hookId = IntPtr.Zero; 

     public DisableTouchConversionToMouse() 
     { 
      hookId = SetHook(hookCallback); 
     } 

     static IntPtr SetHook(LowLevelMouseProc proc) 
     { 
      var moduleHandle = UnsafeNativeMethods.GetModuleHandle(null); 

      var setHookResult = UnsafeNativeMethods.SetWindowsHookEx(HookType.WH_MOUSE_LL, 
proc, moduleHandle, 0); 
      if (setHookResult == IntPtr.Zero) 
      { 
       throw new Win32Exception(); 
      } 
      return setHookResult; 
     } 

     delegate IntPtr LowLevelMouseProc(int nCode, IntPtr wParam, IntPtr lParam); 

     static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) 
     { 

      if (nCode >= 0) 
      { 
       var info = (MSLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(MSLLHOOKSTRUCT)); 

       var extraInfo = (uint)info.dwExtraInfo.ToInt32(); 

       // if ((extraInfo & MOUSEEVENTF_FROMTOUCH) == MOUSEEVENTF_FROMTOUCH) 
       if (extraInfo>0) 
       { 
       Console.WriteLine("TOUCH SCREEN FOUND!"); 
        return new IntPtr(1); 
       } 
      } 

      return UnsafeNativeMethods.CallNextHookEx(hookId, nCode, wParam, lParam); 
     } 
    public enum HookType : int 
     { 
      WH_JOURNALRECORD = 0, 
      WH_JOURNALPLAYBACK = 1, 
      WH_KEYBOARD = 2, 
      WH_GETMESSAGE = 3, 
      WH_CALLWNDPROC = 4, 
      WH_CBT = 5, 
      WH_SYSMSGFILTER = 6, 
      WH_MOUSE = 7, 
      WH_HARDWARE = 8, 
      WH_DEBUG = 9, 
      WH_SHELL = 10, 
      WH_FOREGROUNDIDLE = 11, 
      WH_CALLWNDPROCRET = 12, 
      WH_KEYBOARD_LL = 13, 
      WH_MOUSE_LL = 14 
     } 

     [StructLayout(LayoutKind.Sequential)] 
     struct POINT 
     { 

      public int x; 
      public int y; 
     } 

     [StructLayout(LayoutKind.Sequential)] 
     struct MSLLHOOKSTRUCT 
     { 
      public POINT pt; 
      public uint mouseData; 
      public uint flags; 
      public uint time; 
      public IntPtr dwExtraInfo; 
     } 

     [SuppressUnmanagedCodeSecurity] 
     static class UnsafeNativeMethods 
     { 
      [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
      public static extern IntPtr SetWindowsHookEx(HookType code, LowLevelMouseProc lpfn, IntPtr hMod, 
       uint dwThreadId); 

      [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
      [return: MarshalAs(UnmanagedType.Bool)] 
      public static extern bool UnhookWindowsHookEx(IntPtr hhk); 

      [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
      public static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, 
       IntPtr wParam, IntPtr lParam); 

      [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
      public static extern IntPtr GetModuleHandle(string lpModuleName); 
     } 

उत्तर

2

अपने मुख्य उद्देश्य फोकस से बचने के लिए है, तो वहाँ WS_EX_NOACTIVATE का उपयोग कर

देखें एक सरल समाधान का है अपने मुख्य विंडो से ले जाया जा रहा:

यहाँ उपरोक्त उदाहरणों के आधार पर मेरे कोड है Not take focus, but allow interaction?

+0

यह वही नहीं है जो मुझे चाहिए – Programer

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