IMetroMode :: IsLauncherVisible in C # via pInvoke?

In C # on Windows 8, how can I pInvoke the IMetroMode :: IsLauncherVisible method?

Details for the method are given here: http://msdn.microsoft.com/en-us/library/windows/desktop/hh404166(v=vs.85).aspx

+2
source share
2 answers

Use IAppVisibility instead of deprecated IMetroMode

Here is a sample code:

/* 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 Interface Definition:

 [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); } 
+5
source

A couple of things:

  • It looks like IMetroMode been removed from the RC and RTM builds of Windows 8 .
  • You do not use P / Invoke for WinRT calls, instead you should add the link in your C # project to the corresponding WinMD file with C:\Program Files (x86)\Windows Kits\8.0\References\CommonConfiguration\Neutral\ . This will provide auto-fill interop services that should provide access to whatever WinRT tools you need. You can find more information here .
+1
source

Source: https://habr.com/ru/post/1482966/


All Articles