通过pInvoke在C#中IMetroMode :: IsLauncherVisible?

在Windows 8的C#中,我如何pInvoke IMetroMode :: IsLauncherVisible方法?

该方法的详细信息可在此处找到: http : //msdn.microsoft.com/en-us/library/windows/desktop/hh404166(v = vs.85).aspx

使用IAppVisibility接口而不是过时的IMetroMode接口

以下是示例代码:

/* From ShObjIdl.idl // CLSID_AppVisibility [ uuid(7E5FE3D9-985F-4908-91F9-EE19F9FD1514)] coclass AppVisibility { interface IAppVisibility; } */ Type tIAppVisibility = Type.GetTypeFromCLSID(new Guid("7E5FE3D9-985F-4908-91F9-EE19F9FD1514")); IAppVisibility appVisibility = (IAppVisibility)Activator.CreateInstance(tIAppVisibility); bool launcherVisible; if(HRESULT.S_OK == appVisibility.IsLauncherVisible(out launcherVisible)) { // Here you can use the launcherVisible flag } 

IAppVisibility接口定义:

 [ComImport, Guid("2246EA2D-CAEA-4444-A3C4-6DE827E44313"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IAppVisibility { HRESULT GetAppVisibilityOnMonitor([In] IntPtr hMonitor, [Out] out MONITOR_APP_VISIBILITY pMode); HRESULT IsLauncherVisible([Out] out bool pfVisible); HRESULT Advise([In] IAppVisibilityEvents pCallback, [Out] out int pdwCookie); HRESULT Unadvise([In] int dwCookie); } //... public enum HRESULT : long { S_FALSE = 0x0001, S_OK = 0x0000, E_INVALIDARG = 0x80070057, E_OUTOFMEMORY = 0x8007000E } public enum MONITOR_APP_VISIBILITY { MAV_UNKNOWN = 0, // The mode for the monitor is unknown MAV_NO_APP_VISIBLE = 1, MAV_APP_VISIBLE = 2 } [ComImport, Guid("6584CE6B-7D82-49C2-89C9-C6BC02BA8C38"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IAppVisibilityEvents { HRESULT AppVisibilityOnMonitorChanged( [In] IntPtr hMonitor, [In] MONITOR_APP_VISIBILITY previousMode, [In] MONITOR_APP_VISIBILITY currentMode); HRESULT LauncherVisibilityChange([In] bool currentVisibleState); } 

几件事:

  1. 看起来IMetroMode 已从Windows 8的RC和RTM版本中删除 。
  2. 您不要在WinRT调用上使用P / Invoke,而应将C#项目中的引用添加到C:\Program Files (x86)\Windows Kits\8.0\References\CommonConfiguration\Neutral\的相应WinMD文件中。 这将提供完整的自动完成互操作服务,可以访问您需要的任何WinRT设施。 你可以在这里找到更多信息 。