您应该能够为您的应用程序设置用户模型 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...
}
}
}