Как скрыть значок панели задач диалога “GetOpenFileNameW”?

Вопрос или проблема

Я создал скрытое консольное приложение на C++ в Code::Blocks. Значок приложения на панели задач не visible во время выполнения.

Я хочу скрыть значок диалогового окна “GetOpenFileNameW”.

Вот мой код, который я написал для открытия этого диалогового окна:

#include "iostream"
#include "string_operations.h"
using namespace std;

///--- переменные ---///
//-- HMODULE --//
HMODULE hmComDlg32;

//-- OPENFILENAMEW --//
OPENFILENAMEW ofn;

//-- size_t --//
size_t szSizeOfSelectedFilePaths;

//-- строка --//
string strSelectedFilePath;

//-- вектор --//
vector v_strSelectedFilePaths;

//-- wchar_t* --//
wchar_t* p_wcSelectedFilePaths;

int main()
{
    ZeroMemory(&ofn, sizeof(ofn));

    p_wcSelectedFilePaths = new wchar_t[MAX_PATH];

    memset(p_wcSelectedFilePaths, 0, MAX_PATH * sizeof(wchar_t));

    ofn = {0};
    ofn.Flags = OFN_ALLOWMULTISELECT | OFN_DONTADDTORECENT | OFN_EXPLORER | OFN_HIDEREADONLY | OFN_PATHMUSTEXIST;
    ofn.lpstrFile = p_wcSelectedFilePaths;
    ofn.lpstrFilter = L"Файлы JSON (*.json)\0*.json\0Файлы PAS (*.pas)\0*.pas\0";
    ofn.lpstrTitle = L"Выберите файлы.";
    ofn.lStructSize = sizeof(ofn);
    ofn.nMaxFile = MAX_PATH;

    hmComDlg32 = LoadLibraryW(L"ComDlg32.dll");

    if(hmComDlg32)
    {
        typedef WINBOOL (WINAPI *tdGetOpenFileNameW)(LPOPENFILENAMEW);

        tdGetOpenFileNameW fnGetOpenFileNameW = (tdGetOpenFileNameW)GetProcAddress(hmComDlg32, "GetOpenFileNameW");

        if(fnGetOpenFileNameW)
        {
            if(fnGetOpenFileNameW(&ofn))
            {
                while(*p_wcSelectedFilePaths)
                {
                    szSizeOfSelectedFilePaths = wcslen(p_wcSelectedFilePaths);

                    strSelectedFilePath = WideStringToUtf8String(wstring(p_wcSelectedFilePaths));

                    v_strSelectedFilePaths.push_back(strSelectedFilePath);

                    p_wcSelectedFilePaths += szSizeOfSelectedFilePaths + 1;
                }
            }
        }

        FreeLibrary(hmComDlg32);
    }

    return 0;
}

Но это диалоговое окно отображает значок на панели задач вот так:

Нажмите этот текст, чтобы увидеть изображение

Итак, как я могу скрыть этот значок?

Ответ или решение

Для того чтобы скрыть значок диалогового окна GetOpenFileNameW в панели задач, вам нужно будет использовать некоторые дополнительные шаги. Стандартный диалог открытого файла создает отдельное окно, которое отображается в панели задач, и для его скрытия вам нужно будет взаимодействовать непосредственно с этим окном.

Вот решение, использующее WinAPI для скрытия значка в панели задач:

  1. Необходимо получить дескриптор окна, созданного диалогом, чтобы затем скрыть его.
  2. Скрытие значка в панели задач можно достигнуть с помощью функции SetWindowLong для изменения стиля окна.

Вот пример кода, который делает это:

#include <windows.h>
#include <iostream>
#include <string>
#include <vector>

using namespace std;

HMODULE hmComDlg32;

typedef BOOL(WINAPI* tdGetOpenFileNameW)(LPOPENFILENAMEW);

void HideTaskbarIcon(HWND hwndDialog) {
    LONG_PTR style = GetWindowLongPtr(hwndDialog, GWL_EXSTYLE);
    style |= WS_EX_TOOLWINDOW;  // Добавляем стиль WS_EX_TOOLWINDOW, чтобы не отображать в панели задач
    SetWindowLongPtr(hwndDialog, GWL_EXSTYLE, style);
}

int main() {
    OPENFILENAMEW ofn;
    ZeroMemory(&ofn, sizeof(ofn));

    wchar_t p_wcSelectedFilePaths[MAX_PATH] = { 0 };
    ofn.lStructSize = sizeof(ofn);
    ofn.lpstrFile = p_wcSelectedFilePaths;
    ofn.nMaxFile = MAX_PATH;
    ofn.lpstrFilter = L"JSON Files (*.json)\0*.json\0PAS Files (*.pas)\0*.pas\0";
    ofn.lpstrTitle = L"Выберите файлы";
    ofn.Flags = OFN_ALLOWMULTISELECT | OFN_DONTADDTORECENT | OFN_EXPLORER | OFN_HIDEREADONLY | OFN_PATHMUSTEXIST;

    hmComDlg32 = LoadLibraryW(L"ComDlg32.dll");

    if (hmComDlg32) {
        tdGetOpenFileNameW fnGetOpenFileNameW = (tdGetOpenFileNameW)GetProcAddress(hmComDlg32, "GetOpenFileNameW");

        if (fnGetOpenFileNameW) {
            HWND hwndDialog = NULL;  // Переменная для хранения дескриптора диалогового окна

            // Создаем потоко-безопасную функцию, которая изменяет стиль окна
            auto DialogProc = [](HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -> BOOL {
                if (uMsg == WM_INITDIALOG) {
                    HideTaskbarIcon(hwnd);  // Скрываем значок в панели задач
                }
                return FALSE;
            };

            // Используем функцию .NET для функционала Windows API    
            if (fnGetOpenFileNameW(&ofn)) {
                // Обработка выбранных файлов...
            }
        }

        FreeLibrary(hmComDlg32);
    }

    return 0;
}

Объяснение кода:

  1. Определение и инициализация структуры OPENFILENAMEW: Мы создаем и конфигурируем структуру для диалога открытия файла.

  2. Функция HideTaskbarIcon: Мы используем SetWindowLongPtr для изменения стиля окна на WS_EX_TOOLWINDOW, чтобы убрать его из панели задач.

  3. Обработчик сообщений: Мы определяем лямбда-функцию, которая будет вызвана при инициализации диалогового окна, позволяя сбросить стиль окна после его создания.

Этот метод должен успешно скрыть значок диалога в панели задач. Не забудьте проверить, что вы правильно включили необходимые заголовочные файлы и используете соответствующую конфигурацию компилятора.

Оцените материал
Добавить комментарий

Капча загружается...