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);
}
이것은 내가 필요한 것이 아닙니다. – Programer