如何在触摸屏上关闭Windows 8.1手势并设置超级按钮栏
我有一个触摸屏戴尔和Windows 8.1单语言安装,当我从右边缘向中间移动我的手指时,Windows 8将调出设置魅力条或当我从中间顶部边缘向下移动手指8时隐藏我的应用程序并打开开始菜单。
这是一个问题,因为我在WPF上开发了一个Kiosk应用程序,我不能让用户看到设置或关闭Kiosk应用程序。
我试图禁用它,但不能,简单的解决方案是在另一个操作系统上运行或降级到Windows 7,但机器将运行Windows 8.1单语言,我无能为力。
这是通过.NET interop而不是编译C ++本机DLL的方法:
Imports System.Runtime.InteropServices Imports System.Runtime.CompilerServices Public Class EdgeGestureUtil Private Shared DISABLE_TOUCH_SCREEN As Guid = New Guid("32CE38B2-2C9A-41B1-9BC5-B3784394AA44") Private Shared IID_PROPERTY_STORE As Guid = New Guid("886d8eeb-8cf2-4446-8d02-cdba1dbdcf99") Private Shared VT_BOOL As Short = 11 #Region "Structures" _ Public Structure PropertyKey Public Sub New(guid As Guid, pid As UInt32) fmtid = guid Me.pid = pid End Sub _ Public fmtid As Guid Public pid As UInteger End Structure _ Public Structure PropVariant _ Public vt As Short _ Private wReserved1 As Short _ Private wReserved2 As Short _ Private wReserved3 As Short _ Private cVal As SByte _ Private bVal As Byte _ Private iVal As Short _ Public uiVal As UShort _ Private lVal As Integer _ Private ulVal As UInteger _ Private intVal As Integer _ Private uintVal As UInteger _ Private hVal As Long _ Private uhVal As Long _ Private fltVal As Single _ Private dblVal As Double _ Public boolVal As Boolean _ Private scode As Integer 'CY cyVal; _ Private [date] As DateTime _ Private filetime As System.Runtime.InteropServices.ComTypes.FILETIME 'CLSID* puuid; 'CLIPDATA* pclipdata; 'BSTR bstrVal; 'BSTRBLOB bstrblobVal; _ Private blobVal As Blob 'LPSTR pszVal; _ Private pwszVal As IntPtr '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 Function GetBlob() As Byte() Dim Result As Byte() = New Byte(blobVal.Length - 1) {} Marshal.Copy(blobVal.Data, Result, 0, Result.Length) Return Result End Function ''' ''' Property value ''' Public ReadOnly Property Value() As Object Get Dim ve As VarEnum = vt Select Case 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() End Select Throw New NotImplementedException("PropVariant " + ve.ToString()) End Get End Property End Structure Friend Structure Blob Public Length As Integer Public Data As IntPtr '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 Sub FixCS0649() Length = 0 Data = IntPtr.Zero End Sub End Structure #End Region #Region "Interfaces" _ Interface IPropertyStore _ Sub GetCount( ByRef cProps As UInteger) _ Sub GetAt(<[In]> iProp As UInteger, ByRef pkey As PropertyKey) _ Sub GetValue(<[In]> ByRef key As PropertyKey, ByRef pv As PropVariant) _ Sub SetValue(<[In]> ByRef key As PropertyKey, <[In]> ByRef pv As PropVariant) _ Sub Commit() _ Sub Release() End Interface #End Region #Region "Methods" _ Private Shared Function SHGetPropertyStoreForWindow(handle As IntPtr, ByRef riid As Guid, ByRef propertyStore As IPropertyStore) As Integer End Function Public Shared Sub EnableEdgeGestures(ByVal hwnd As IntPtr, ByVal enable As Boolean) Dim pPropStore As IPropertyStore = Nothing Dim hr As Integer hr = SHGetPropertyStoreForWindow(hwnd, IID_PROPERTY_STORE, pPropStore) If hr = 0 Then Dim propKey As New PropertyKey propKey.fmtid = DISABLE_TOUCH_SCREEN propKey.pid = 2 Dim var As New PropVariant var.vt = VT_BOOL var.boolVal = enable pPropStore.SetValue(propKey, var) Marshal.FinalReleaseComObject(pPropStore) End If End Sub #End Region End Class
我也有同样的问题。 我使用了名为PKEY_EdgeGesture_DisableTouchWhenFullscreen的Windows系统属性( https://msdn.microsoft.com/en-us/library/windows/desktop/jj553591(v=vs.85).aspx )。
c# – >通过P / Invoke调用dll – >设置PKEY_EdgeGesture_DisableTouchWhenFullscreen属性。
Nota Bene:此解决方案不适用于Modern UI应用程序。 对于Modern UI app,使用kiosk模式:Assigned Access https://technet.microsoft.com/en-us/library/dn465334.aspx 。
代码段DLL:
extern "C" __declspec(dllexport) bool SetTouchDisableProperty(HWND hWnd) { PROPVARIANT var; var.vt = VT_BOOL; var.boolVal = VARIANT_TRUE; // Get window properties IPropertyStore* pPropStore; IID_PPV_ARGS(&pPropStore); HRESULT hrReturnValue = SHGetPropertyStoreForWindow(hWnd, IID_PPV_ARGS(&pPropStore)); // set PKEY_EdgeGesture_DisableTouchWhenFullscreen property if (SUCCEEDED(hrReturnValue)) { hrReturnValue = pPropStore->SetValue(PKEY_EdgeGesture_DisableTouchWhenFullscreen, var); pPropStore->Release(); } return TRUE; }
用于调用dll的代码段c#:
[DllImport("libDisableTouchDll.dll", EntryPoint = "SetTouchDisableProperty" , ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)] static extern bool SetTouchDisableProperty(IntPtr hWnd); static void Main(string[] args) { // dirty get inPtr process for firefox IntPtr intPtr = System.Diagnostics.Process.GetProcessesByName("firefox")[0].MainWindowHandle; SetTouchDisableProperty(intPtr); }
我会使用Win 8.1s内置的kiosk模式来实现这一点,因为我假设你正在开发一个Win 8.1应用程序: http : //www.geek.com/microsoft/windows-8-1-kiosk-mode-locks-系统到一个单APP-1552963 /
https://www.howtogeek.com/173562/how-to-easily-put-a-windows-pc-into-kiosk-mode-with-assigned-access/
上述就是C#学习教程:如何在触摸屏上关闭Windows 8.1手势并设置超级按钮栏分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/953795.html