在Windows 8+中,如何通过API在前台使用Metro App时将Window Desktop App带到前台?

时间:2014-08-05 13:43:38

标签: winapi windows-8 window setforegroundwindow

我的桌面应用程序挂钩了一些热键,例如:CTRL + SHIFT + F12,按下热键时,它会将我的桌面应用程序窗口置于前台或保持在顶部。但是在Window 8或8.1中,当它在Window Start Screen或Metro App在前台运行时,我的程序无法切换回桌面模式并将我的窗口置于前台。我试过以下API,     SetFocus的(HWND);     ShowWindow(hwnd,SW_SHOW);     SetActiveWindow(HWND);     SetForegroundWindow(HWND);     SwitchToThisWindow(HWND);

我甚至在“explorer.exe shell ::: {3080F90D-D7AD-11D9-BD98-0000947B0257}”上尝试使用ShellExecute,它不起作用。

我不确定Classic Shell最新版本(http://www.classicshell.net)是如何做到这一点的,当我按下SHIFT + WIN键时,它能够从Metro模式切换回桌面模式并显示Classic Shell窗口

感谢。

1 个答案:

答案 0 :(得分:1)

您应该能够为您的应用设置User Model ID并使用一些较新的API,以便在用户处于" Metro"时将其置于焦点。以下是C ++中的一些代码片段,用于说明:

某处共享:

const wchar_t MY_APP_USER_MODEL_ID[] = L"CompanyName.ProductSuite.AppName";

在您的"桌面"应用程序启动:

HRESULT hr = SetCurrentProcessExplicitAppUserModelID(const_cast<PWSTR>(MY_APP_USER_MODEL_ID));
// Check that SUCCEEDED(hr)

在您的焦点代码中

IApplicationActivationManager* appMgr = nullptr;
if(SUCCEEDED(::CoCreateInstance(CLSID_ApplicationActivationManager, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&appMgr)))) {
  DWORD pid = 0;
  appMgr->ActivateApplication(MY_APP_USER_MODEL_ID, nullptr, AO_NOERRORUI, &pid);
  appMgr->Release();
}

您的快捷方式:

微软还介绍了与所有这些相关的其他一些愚蠢规则。您可能必须在应用程序的快捷方式中添加一些其他信息,将该快捷方式固定到开始菜单以使所有这些工作正常(不,严重) 。如果您发现这种情况,可以使用以下代码来更新快捷方式并添加模型ID:

// Assuming you already have a valid IShellLink to work with
ComPtr<IPropertyStore> propertyStore;
if(SUCCEEDED(shellLink.As(&propertyStore))) {
  PROPVARIANT appIdPropVar;
  if(SUCCEEDED(::InitPropVariantFromString(MY_APP_USER_MODEL_ID, &appIdPropVar))) {
    if(SUCCEEDED(propertyStore->SetValue(PKEY_AppUserModel_ID, appIdPropVar)) &&
      SUCCEEDED(propertyStore->Commit()))
    {
     // go on to save your link/shortcut to disk...
    }
  }
}