2

我的桌面应用程序挂钩了一些热键,例如: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 Mode 切换回桌面模式并显示 Classic Shell窗户。

谢谢。

4

1 回答 1

1

您应该能够为您的应用程序设置用户模型 ID,并在用户处于“Metro”时使用一些较新的 API 使其成为焦点。下面是一些 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...
    }
  }
}
于 2014-08-06T15:51:06.203 回答