IMetroMode:: IsLauncherVisible в С# через pInvoke?

В С# в Windows 8, как я могу pInvoke метод IMetroMode:: IsLauncherVisible?

Подробности для метода приведены здесь: http://msdn.microsoft.com/en-us/library/windows/desktop/hh404166(v=vs.85).aspx

2 ответа

Используйте интерфейс 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);
}


Пара вещей:

  • Похоже, IMetroMode был удален из RC и RTM сборок Windows 8.
  • Вы не используете P/Invoke для вызовов WinRT, вместо этого вы должны добавить ссылку в свой проект С# в соответствующий файл WinMD с C:\Program Files (x86)\Windows Kits\8.0\References\CommonConfiguration\Neutral\. Это обеспечит услуги interop с автозаполнением, которые должны обеспечить доступ к любым средствам WinRT, которые вам нужны. Вы можете найти дополнительную информацию здесь.

licensed under cc by-sa 3.0 with attribution.