2013-05-23 1 views
6

WPF C# 응용 프로그램이 있습니다. 듀얼 스크린이 있고 터치 스크린이기 때문에 마우스 이벤트를 취소하고 싶습니다. 사용자가 누를 때마다 메인 스크린에서 포커스를 끕니다. 사용자의 데이터를 요청할 때만 터치를 활성화 한 다음 차단하려고합니다.터치 스크린 마우스 장치 이벤트 비활성화 setwindowshookex (user32.dll) 사용

나는 장치 입력을 잡는 데 도움이되는 user32.dll을 사용하여 응용 프로그램 후크에 대한 몇 가지 좋은 예를 발견했습니다. 한 예가 여기에 표시됩니다 : http://www.pinvoke.net/default.aspx/user32.setwindowshookex. 그리고 다른 마우스 이벤트에 더 적합 할 수 있습니다 여기에 표시 할 수 있습니다 : How to avoid mouse move on Touch

내 문제는 장치 입력을 포착하는 것이 아니라 비활성화하는 것입니다. 위의 첫 번째 예제는 키보드 입력을 잡아 키 누름을 추출하는 방법을 보여 주지만 해제하지는 않습니다.

두 번째 예도 제대로 작동하지 않습니다. 그것은 마우스 이벤트, 일반 USB 마우스 장치 및 터치 스크린 장치를 포착합니다. 나는 어느 것을 알 수 있지만 터치 스크린 장치를 취소 할 수는 없습니다. 이 예에서는 터치 장치에 대해 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