-
-
Save ahmed-shariff/d7d679b5c507a5dd84ee639dcf3ff2f0 to your computer and use it in GitHub Desktop.
Globally disable the conversion of touch events to mouse events in Windows 7
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
namespace BlackFox | |
{ | |
using System; | |
using System.ComponentModel; | |
using System.Runtime.InteropServices; | |
using System.Security; | |
/// <summary> | |
/// As long as this object exists all mouse events created from a touch event for legacy support will be disabled. | |
/// </summary> | |
class DisableTouchConversionToMouse : IDisposable | |
{ | |
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(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) | |
{ | |
return new IntPtr(1); | |
} | |
} | |
return UnsafeNativeMethods.CallNextHookEx(hookId, nCode, wParam, lParam); | |
} | |
bool disposed; | |
public void Dispose() | |
{ | |
if (disposed) return; | |
UnsafeNativeMethods.UnhookWindowsHookEx(hookId); | |
disposed = true; | |
GC.SuppressFinalize(this); | |
} | |
~DisableTouchConversionToMouse() | |
{ | |
Dispose(); | |
} | |
#region Interop | |
// ReSharper disable InconsistentNaming | |
// ReSharper disable MemberCanBePrivate.Local | |
// ReSharper disable FieldCanBeMadeReadOnly.Local | |
const uint MOUSEEVENTF_FROMTOUCH = 0xFF515700; | |
const int 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(int idHook, 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); | |
} | |
// ReSharper restore InconsistentNaming | |
// ReSharper restore FieldCanBeMadeReadOnly.Local | |
// ReSharper restore MemberCanBePrivate.Local | |
#endregion | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment