Почему я не могу установить эскиз на панели задач, используя DwmSetIconicThumbnail? - PullRequest
1 голос
/ 03 мая 2019

Мне нужна ваша помощь для проекта на моей работе. Основное программное обеспечение, использующее язык 4D, работает как MDI, оно создает много окон, включенных в главное окно. Основная проблема в том, что у нас много окон, и нам нужен простой способ переключения с одного окна на другое. Мы решили создать небольшой плагин c ++, который является dll для решения этой проблемы.

Этот плагин создаст вкладку на панели задач для каждого окна, открытого как Windows Explorer. Создание и удаление вкладок уже работает.

Но в настоящее время проблема заключается в том, что на вкладке не установлено ни одного эскиза.

Данный параметр является идентификатором окна основного программного обеспечения. Метод с именем PA_GetHWND - это метод, данный 4D для получения дескриптора окна с использованием windowID. Я уже проверил, где проблема. Растровое изображение, созданное из окна, уже существует и является хорошим. Для этого теста я поместил растровое изображение в буфер обмена и вставил его в Paint, и растровое изображение было хорошим.

Вот код, представляющий метод обновления растрового изображения на вкладке.

bool CManageTaskBar::UpdateWindow(long WindowID) 
{

    HRESULT res;
    HDC hdcScreen;
    HDC hdcWindow;
    HDC hdcMemDC = NULL;
    HBITMAP hbmScreen = NULL;

    //Get the Handle from 4D
        HWND nHandle = (HWND)(PA_GetHWND((PA_WindowRef)(WindowID)));

    // Retrieve the handle to a display device context for the client 
    // area of the window. 
    hdcScreen = GetDC(NULL);
    hdcWindow = GetDC(nHandle);

    // Create a compatible DC which is used in a BitBlt from the window DC
    hdcMemDC = CreateCompatibleDC(hdcWindow);

    // Get the client area for size calculation
    RECT rcClient;
    GetClientRect(nHandle, &rcClient);

    // Create a compatible bitmap from the Window DC
    hbmScreen = CreateCompatibleBitmap(hdcWindow,rcClient.right - rcClient.left, rcClient.bottom - rcClient.top);

    // Select the compatible bitmap into the compatible memory DC.
    SelectObject(hdcMemDC, hbmScreen);

    // Bit block transfer into our compatible memory DC.
    if (!BitBlt(hdcMemDC,
        0, 0,
        rcClient.right - rcClient.left, rcClient.bottom - rcClient.top,
        hdcWindow,
        0, 0,
        SRCCOPY))
    {
        MessageBox(nHandle, L"BitBlt has failed", L"Failed", MB_OK);
        //goto done;
    }

    ITaskbarList3* ptbl = NULL;
    HRESULT hr = CoCreateInstance(my_CLSID_TaskbarList, NULL, CLSCTX_ALL, my_IID_ITaskbarList3, (LPVOID*)&ptbl);


    BOOL fForceIconic = TRUE;
    BOOL fHasIconic = TRUE;
    res = DwmSetWindowAttribute(nHandle, DWMWA_FORCE_ICONIC_REPRESENTATION, &fForceIconic, sizeof(fForceIconic));
    res = DwmSetWindowAttribute(nHandle, DWMWA_HAS_ICONIC_BITMAP, &fHasIconic, sizeof(fHasIconic));

    if (hbmScreen)
    {
        res = DwmSetIconicThumbnail(nHandle, hbmScreen,0);//DWM_SIT_DISPLAYFRAME);
    }

    DeleteObject(hbmScreen);
    DeleteObject(hdcMemDC);
    ReleaseDC(NULL, hdcScreen);
    ReleaseDC(nHandle, hdcWindow);

    return true;
}

Звонки на DwmSetWindowAttribute возвращают неверный дескриптор. Этот дескриптор работает для получения растрового изображения, но не для установки атрибута.

И вызов DwmSetIconicThumbnail возвращает E_INVALIDARG возможно, потому что данный дескриптор неверен.

Почему я не могу установить атрибут для этого дескриптора и почему вызов для установки миниатюры возвращает E_INVALIDARG?

Спасибо всем, кто позаботится о моей проблеме. Это мой первый вопрос, будьте дружелюбны, пожалуйста:)

...