using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Diagnostics; using System.Runtime.InteropServices; using System.Runtime.CompilerServices; namespace EdgeGesture { public class EdgeGestureUtil { private static Guid DISABLE_TOUCH_SCREEN = new Guid("32CE38B2-2C9A-41B1-9BC5-B3784394AA44"); private static Guid IID_PROPERTY_STORE = new Guid("886d8eeb-8cf2-4446-8d02-cdba1dbdcf99"); private static short VT_BOOL = 11; #region "Structures" [StructLayout(LayoutKind.Sequential, Pack = 4)] public struct PropertyKey { public PropertyKey(Guid guid, UInt32 pid) { fmtid = guid; this.pid = pid; } [MarshalAs(UnmanagedType.Struct)] public Guid fmtid; public uint pid; } [StructLayout(LayoutKind.Explicit)] public struct PropVariant { [FieldOffset(0)] public short vt; [FieldOffset(2)] private short wReserved1; [FieldOffset(4)] private short wReserved2; [FieldOffset(6)] private short wReserved3; [FieldOffset(8)] private sbyte cVal; [FieldOffset(8)] private byte bVal; [FieldOffset(8)] private short iVal; [FieldOffset(8)] public ushort uiVal; [FieldOffset(8)] private int lVal; [FieldOffset(8)] private uint ulVal; [FieldOffset(8)] private int intVal; [FieldOffset(8)] private uint uintVal; [FieldOffset(8)] private long hVal; [FieldOffset(8)] private long uhVal; [FieldOffset(8)] private float fltVal; [FieldOffset(8)] private double dblVal; [FieldOffset(8)] public bool boolVal; [FieldOffset(8)] private int scode; //CY cyVal; [FieldOffset(8)] private DateTime date; [FieldOffset(8)] private System.Runtime.InteropServices.ComTypes.FILETIME filetime; //CLSID* puuid; //CLIPDATA* pclipdata; //BSTR bstrVal; //BSTRBLOB bstrblobVal; [FieldOffset(8)] private Blob blobVal; //LPSTR pszVal; [FieldOffset(8)] private IntPtr pwszVal; //LPWSTR //IUnknown* punkVal; //IDispatch* pdispVal; // IStream* pStream; // IStorage* pStorage; // LPVERSIONEDSTREAM pVersionedStream; // LPSAFEARRAY parray; // CAC cac; // CAUB caub; // CAI cai; // CAUI caui; // CAL cal; // CAUL caul; // CAH cah; // CAUH cauh; // CAFLT caflt; // CADBL cadbl; // CABOOL cabool; // CASCODE cascode; // CACY cacy; // CADATE cadate; // CAFILETIME cafiletime; // CACLSID cauuid; // CACLIPDATA caclipdata; // CABSTR cabstr; // CABSTRBLOB cabstrblob; // CALPSTR calpstr; // CALPWSTR calpwstr; // CAPROPVARIANT capropvar; // CHAR* pcVal; // UCHAR* pbVal; // SHORT* piVal; // USHORT* puiVal; // LONG* plVal; // ULONG* pulVal; // INT* pintVal; // UINT* puintVal; // FLOAT* pfltVal; // DOUBLE* pdblVal; // VARIANT_BOOL* pboolVal; // DECIMAL* pdecVal; // SCODE* pscode; // CY* pcyVal; // DATE* pdate; // BSTR* pbstrVal; // IUnknown** ppunkVal; // IDispatch** ppdispVal; // LPSAFEARRAY* pparray; // PROPVARIANT* pvarVal; // /// /// Helper method to gets blob data /// private byte[] GetBlob() { byte[] Result = new byte[blobVal.Length]; Marshal.Copy(blobVal.Data, Result, 0, Result.Length); return Result; } /// /// Property value /// public object Value { get { VarEnum ve = (VarEnum)vt; switch (ve) { case VarEnum.VT_I1: return bVal; case VarEnum.VT_I2: return iVal; case VarEnum.VT_I4: return lVal; case VarEnum.VT_I8: return hVal; case VarEnum.VT_INT: return iVal; case VarEnum.VT_UI4: return ulVal; case VarEnum.VT_LPWSTR: return Marshal.PtrToStringUni(pwszVal); case VarEnum.VT_BLOB: return GetBlob(); } throw new NotImplementedException("PropVariant " + ve.ToString()); } } } internal struct Blob { public int Length; public IntPtr Data; //Code Should Compile at warning level4 without any warnings, //However this struct will give us Warning CS0649: Field [Fieldname] //is never assigned to, and will always have its default value //You can disable CS0649 in the project options but that will disable //the warning for the whole project, it's a nice warning and we do want //it in other places so we make a nice dummy function to keep the compiler //happy. private void FixCS0649() { Length = 0; Data = IntPtr.Zero; } } #endregion #region "Interfaces" [ComImport(), Guid("886D8EEB-8CF2-4446-8D02-CDBA1DBDCF99"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IPropertyStore { [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] void GetCount([Out(), In()] ref uint cProps); [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] void GetAt([In()] uint iProp, ref PropertyKey pkey); [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] void GetValue([In()] ref PropertyKey key, ref PropVariant pv); [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] void SetValue([In()] ref PropertyKey key, [In()] ref PropVariant pv); [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] void Commit(); [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] void Release(); } #endregion #region "Methods" [DllImport("shell32.dll", SetLastError = true)] private static extern int SHGetPropertyStoreForWindow(IntPtr handle, Guid riid, ref IPropertyStore propertyStore); public static void EnableEdgeGestures(IntPtr hwnd, bool enable) { IPropertyStore pPropStore = null; int hr = 0; hr = SHGetPropertyStoreForWindow(hwnd, IID_PROPERTY_STORE, ref pPropStore); if (hr == 0) { PropertyKey propKey = new PropertyKey(); propKey.fmtid = DISABLE_TOUCH_SCREEN; propKey.pid = 2; PropVariant var = new PropVariant(); var.vt = VT_BOOL; var.boolVal = enable; pPropStore.SetValue(ref propKey, ref var); Marshal.FinalReleaseComObject(pPropStore); } } #endregion } //======================================================= //Service provided by Telerik (www.telerik.com) //Conversion powered by NRefactory. //Twitter: @telerik //Facebook: facebook.com/telerik //======================================================= }