首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PKEY_EdgeGesture_DisableTouchWhenFullscreen不使用Win 10周年更新

PKEY_EdgeGesture_DisableTouchWhenFullscreen不使用Win 10周年更新
EN

Stack Overflow用户
提问于 2016-09-28 14:51:58
回答 1查看 501关注 0票数 0

PKEY_EdgeGesture_DisableTouchWhenFullscreen 能找出为什么不再与Win 10周年更新一起工作,以及如何解决这个问题?

目前,我正在使用来自here的Ron代码来禁用我的应用程序中的边缘手势。

它在Win 10 RTM和Win 10 11月更新(1151)中运行良好,但不再适用于Win 10周年更新。所谓不再有效,我的意思是没有错误或异常,简单地调用该方法并不会禁用边缘手势。

而不是,重写的应用程序赢10 Kiosk模式(例如。使它成为一个地铁或通用应用程序)不是一个解决方案!

由于我是c#开发人员而不是本地c++开发人员,我不知道如何解决这个问题.

我在c#中的代码:

代码语言:javascript
运行
复制
internal static class EdgeGestureUtil
{
    private static readonly short VT_BOOL = 11;
    private static readonly Guid DISABLE_TOUCH_SCREEN = new Guid("32CE38B2-2C9A-41B1-9BC5-B3784394AA44");
    private static Guid IID_PROPERTY_STORE = new Guid("886d8eeb-8cf2-4446-8d02-cdba1dbdcf99");

    #region "Structures"
    [StructLayout(LayoutKind.Sequential, Pack = 4)]
    private struct PropertyKey
    {
        [MarshalAs(UnmanagedType.Struct)]
        public Guid fmtid;
        public uint pid;

        public PropertyKey(Guid guid, UInt32 pid)
        {
            this.fmtid = guid;
            this.pid = pid;
        }
    }

    [StructLayout(LayoutKind.Explicit)]
    private 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;
        //        

        /// <summary>
        /// Helper method to gets blob data
        /// </summary>
        private byte[] GetBlob()
        {
            byte[] result = new byte[this.blobVal.Length];
            Marshal.Copy(this.blobVal.Data, result, 0, result.Length);
            return result;
        }

        /// <summary>
        /// Property value
        /// </summary>
        public object Value
        {
            get
            {
                VarEnum ve = (VarEnum)this.vt;
                switch (ve)
                {
                    case VarEnum.VT_I1:
                        return this.bVal;
                    case VarEnum.VT_I2:
                        return this.iVal;
                    case VarEnum.VT_I4:
                        return this.lVal;
                    case VarEnum.VT_I8:
                        return this.hVal;
                    case VarEnum.VT_INT:
                        return this.iVal;
                    case VarEnum.VT_UI4:
                        return this.ulVal;
                    case VarEnum.VT_LPWSTR:
                        return Marshal.PtrToStringUni(this.pwszVal);
                    case VarEnum.VT_BLOB:
                        return this.GetBlob();
                    default:
                        throw new NotImplementedException("PropVariant " + ve.ToString());
                }
            }
        }
    }

    private 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()
        {
            this.Length = 0;
            this.Data = IntPtr.Zero;
        }
    }
    #endregion

    #region "Interfaces"
    [ComImport(), Guid("886D8EEB-8CF2-4446-8D02-CDBA1DBDCF99"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    private interface IPropertyStore
    {
        [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
        void GetCount([In(), Out()] 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, ref Guid riid, ref IPropertyStore propertyStore);

    internal static void DisableEdgeGestures(IntPtr hwnd, bool disable)
    {
        IPropertyStore pPropStore = null;
        int hr = EdgeGestureUtil.SHGetPropertyStoreForWindow(hwnd, ref EdgeGestureUtil.IID_PROPERTY_STORE, ref pPropStore);
        if (hr == 0)
        {
            PropertyKey propKey = new PropertyKey();
            propKey.fmtid = EdgeGestureUtil.DISABLE_TOUCH_SCREEN;
            propKey.pid = 2;

            PropVariant var = new PropVariant();
            var.vt = EdgeGestureUtil.VT_BOOL;
            var.boolVal = disable;

            pPropStore.SetValue(ref propKey, ref var);
            Marshal.FinalReleaseComObject(pPropStore);
        }
    }
    #endregion
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-07 07:00:44

我找到了一个解决办法:

如何在Windows10中禁用触摸屏边缘滑动(仅限周年版)

1)开放的注册表编辑器。

2)转到以下注册表键:

代码语言:javascript
运行
复制
HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\EdgeUI

您可能没有这样的密钥,所以只需创建它。

3)创建一个新的32位DWORD值,名为AllowEdgeSwipe。将其值数据保留为0(零),以禁用边缘滑动。

4)应用更改重新启动Windows 10。

当然,这将永久地禁用边缘滑动。以前的PKEY_EdgeGesture_DisableTouchWhenFullscreen方法只允许在应用程序运行时禁用边缘滑动.

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39750979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档