我的桌面应用程序挂钩了一些热键,例如: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窗口
感谢。
答案 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...
}
}
}