| Index: app/win_util.cc
|
| ===================================================================
|
| --- app/win_util.cc (revision 21216)
|
| +++ app/win_util.cc (working copy)
|
| @@ -8,6 +8,7 @@
|
| #include <atlapp.h>
|
| #include <commdlg.h>
|
| #include <dwmapi.h>
|
| +#include <propvarutil.h>
|
| #include <shellapi.h>
|
| #include <shlobj.h>
|
|
|
| @@ -19,6 +20,7 @@
|
| #include "base/gfx/gdi_util.h"
|
| #include "base/gfx/png_encoder.h"
|
| #include "base/logging.h"
|
| +#include "base/native_library.h"
|
| #include "base/registry.h"
|
| #include "base/scoped_handle.h"
|
| #include "base/string_util.h"
|
| @@ -35,6 +37,18 @@
|
|
|
| namespace {
|
|
|
| +const wchar_t kShell32[] = L"shell32.dll";
|
| +const char kSHGetPropertyStoreForWindow[] = "SHGetPropertyStoreForWindow";
|
| +
|
| +// Define the type of SHGetPropertyStoreForWindow is SHGPSFW.
|
| +typedef DECLSPEC_IMPORT HRESULT (STDAPICALLTYPE *SHGPSFW)(HWND hwnd,
|
| + REFIID riid,
|
| + void** ppv);
|
| +
|
| +EXTERN_C const PROPERTYKEY DECLSPEC_SELECTANY PKEY_AppUserModel_ID =
|
| + { { 0x9F4C2855, 0x9F79, 0x4B39,
|
| + { 0xA8, 0xD0, 0xE1, 0xD4, 0x2D, 0xE1, 0xD5, 0xF3, } }, 5 };
|
| +
|
| // Enforce visible dialog box.
|
| UINT_PTR CALLBACK SaveAsDialogHook(HWND dialog, UINT message,
|
| WPARAM wparam, LPARAM lparam) {
|
| @@ -825,4 +839,44 @@
|
| return gfx::Font::CreateFont(caption_font);
|
| }
|
|
|
| +void SetAppIdForWindow(const std::wstring& app_id, HWND hwnd) {
|
| + // This funcationality is only available on Win7+.
|
| + if (win_util::GetWinVersion() != win_util::WINVERSION_WIN7)
|
| + return;
|
| +
|
| + // Load Shell32.dll into memory.
|
| + // TODO(brg): Remove this mechanism when the Win7 SDK is available in trunk.
|
| + std::wstring shell32_filename(kShell32);
|
| + FilePath shell32_filepath(shell32_filename);
|
| + base::NativeLibrary shell32_library = base::LoadNativeLibrary(
|
| + shell32_filepath);
|
| +
|
| + if (!shell32_library)
|
| + return;
|
| +
|
| + // Get the function pointer for SHGetPropertyStoreForWindow.
|
| + void* function = base::GetFunctionPointerFromNativeLibrary(
|
| + shell32_library,
|
| + kSHGetPropertyStoreForWindow);
|
| +
|
| + if (!function) {
|
| + base::UnloadNativeLibrary(shell32_library);
|
| + return;
|
| + }
|
| +
|
| + // Set the application's name.
|
| + PROPVARIANT pv;
|
| + InitPropVariantFromString(app_id.c_str(), &pv);
|
| +
|
| + IPropertyStore* pps;
|
| + SHGPSFW SHGetPropertyStoreForWindow = static_cast<SHGPSFW>(function);
|
| + if (S_OK == SHGetPropertyStoreForWindow(hwnd, IID_PPV_ARGS(&pps)) &&
|
| + S_OK == pps->SetValue(PKEY_AppUserModel_ID, pv)) {
|
| + pps->Commit();
|
| + }
|
| +
|
| + // Cleanup.
|
| + base::UnloadNativeLibrary(shell32_library);
|
| +}
|
| +
|
| } // namespace win_util
|
|
|