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
}
안녕하세요 Marko, 레지스트리 트릭없이이를 수행하는 방법을 알아 냈습니까? 당신이 말했듯이, 응용 프로그램에 대해이 동작을 활성화/비활성화하는 것은 제가 사용하고자하는 해결책입니다. 감사합니다 – Deitools
@Deitools - 다른 솔루션을 보지 못했지만 레지스트리 해킹. 응용 프로그램은 Powershell 또는 새 CMD 프로세스를 사용하여 필수 키를 만들 수 있습니다. 이 앱이 작동하려면 적어도 한 번은 관리자 권한으로 실행해야하지만 ... – Marko