2016-09-28 1 views
0

PKEY_EdgeGesture_DisableTouchWhenFullscreen이 더 이상 Win 10 기념일 업데이트와 함께 작동하지 않는 이유와 문제점을 해결할 수 있습니까?PKEY_EdgeGesture_DisableTouchWhenFullscreen이 Win 10 기념일 업데이트와 함께 작동하지 않습니다.

현재 내 앱에서 가장자리 제스처를 사용 중지하려면 here에서 Ron Schuler의 코드를 사용하고 있습니다.
Win 10 RTM 및 Win 10 11 월 업데이트 (1151)에서는 정상적으로 작동하지만 Windows 10 기념일 업데이트에서는 더 이상 작동하지 않습니다. 더 이상 작동하지 않아서, 오류 또는 예외가 없다는 것을 의미합니다. 단순히 메서드를 호출해도 가장자리 동작이 비활성화되지 않습니다.

아니요, Windows 10 키오스크 모드 (예 : 메트로 또는 유니버설 앱 만들기) 용 앱을 다시 작성하는 것은 해결책이 아닙니다! 나는 교류 # 개발자가 아닌 네이티브 C++ 일 오전, 나는이 문제를 해결하는 방법을 모른다

...

C#에서 내 코드 : 나는 해결 방법을 발견했다

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 
} 
+0

안녕하세요 Marko, 레지스트리 트릭없이이를 수행하는 방법을 알아 냈습니까? 당신이 말했듯이, 응용 프로그램에 대해이 동작을 활성화/비활성화하는 것은 제가 사용하고자하는 해결책입니다. 감사합니다 – Deitools

+0

@Deitools - 다른 솔루션을 보지 못했지만 레지스트리 해킹. 응용 프로그램은 Powershell 또는 새 CMD 프로세스를 사용하여 필수 키를 만들 수 있습니다. 이 앱이 작동하려면 적어도 한 번은 관리자 권한으로 실행해야하지만 ... – Marko

답변

0

:

방법 윈도우 10 (전용 주년 기념 에디션)

1) 열기 레지스트리 편집기에서 터치 스크린 가장자리 스 와이프를 사용하지 않도록합니다.
2) 다음 레지스트리 키로 이동 : 당신은 아마 이러한 키가없는

HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\EdgeUI 

, 그래서 그냥 그것을 만들 수 있습니다.

3) AllowEdgeSwipe이라는 새 32 비트 DWORD 값을 만듭니다. 가장자리 값을 사용하지 않으려면 값 데이터를 0 (영)으로 두십시오.
4) 변경 사항을 적용하려면 Windows 10을 다시 시작하십시오.

이렇게하면 가장자리를 영구적으로 비활성화 할 수 있습니다. 이전 PKEY_EdgeGesture_DisableTouchWhenFullscreen 메서드는 응용 프로그램이 실행 중일 때만 가장자리 제거를 허용했습니다 ...

관련 문제