我想为 Windows 8 创建一个新的全屏“信息亭”WPF 应用程序。它不是现代 UI 应用程序。
该应用程序应自动启动,并且必须是不可关闭的。一些事情已经实现。该应用程序使用注册表值禁用硬件 Windows 键并从 Windows 启动。
唯一不起作用的是禁用 Charms-Bar。我已经测试了很多东西,比如 DisableCharmsHint-Registry 值。但它不起作用。而且我在网上搜索并看到了一个 API-Call,它应该禁用 CharmsBar - 但它不起作用。我希望有人能提供帮助。
这是我的助手类。我用 MainWindow-Handle 和 false 调用 EnableEdgeGestures - 方法 - 禁用。
API-Call SHGetPropertyStoreForWindow 的结果始终为 0。
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Runtime.CompilerServices;
namespace Helpers {
public class EdgeGestureUtil {
#region Strukturen
[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;
//
/// <summary>
/// Helper method to gets blob data
/// </summary>
private byte[] GetBlob ( ) {
byte[] Result = new byte[ blobVal.Length ];
Marshal.Copy ( blobVal.Data, Result, 0, Result.Length );
return Result;
}
/// <summary>
/// Property value
/// </summary>
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 PropertyStore
[ComImport, Guid ( "886D8EEB-8CF2-4446-8D02-CDBA1DBDCF99" ), InterfaceType ( ComInterfaceType.InterfaceIsIUnknown )]
interface IPropertyStore {
[MethodImpl ( MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime )]
void GetCount ( [Out] out uint cProps );
[MethodImpl ( MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime )]
void GetAt ( [In] uint iProp, out PropertyKey pkey );
[MethodImpl ( MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime )]
void GetValue ( [In] ref PropertyKey key, out 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 ( );
}
#endregion
#region Methoden
[DllImport ( "shell32.dll", SetLastError = true )]
static extern int SHGetPropertyStoreForWindow (
IntPtr handle, ref Guid riid, [Out, MarshalAs ( UnmanagedType.Interface )] out IPropertyStore propertyStore );
public static void EnableEdgeGestures ( IntPtr hwnd, bool enable ) {
IPropertyStore pPropStore = null;
int hr = 0;
hr = SHGetPropertyStoreForWindow (
hwnd, ref IID_PROPERTY_STORE, out 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
static Guid DISABLE_TOUCH_SCREEN = new Guid ( "32CE38B2-2C9A-41B1-9BC5-B3784394AA44" );
static Guid IID_PROPERTY_STORE = new Guid ( "886d8eeb-8cf2-4446-8d02-cdba1dbdcf99" );
static short VT_BOOL = 11;
}
}
问候罗尼