Вопрос или проблема
Я создал скрытое консольное приложение на 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 для скрытия значка в панели задач:
- Необходимо получить дескриптор окна, созданного диалогом, чтобы затем скрыть его.
- Скрытие значка в панели задач можно достигнуть с помощью функции
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;
}
Объяснение кода:
-
Определение и инициализация структуры
OPENFILENAMEW
: Мы создаем и конфигурируем структуру для диалога открытия файла. -
Функция
HideTaskbarIcon
: Мы используемSetWindowLongPtr
для изменения стиля окна наWS_EX_TOOLWINDOW
, чтобы убрать его из панели задач. -
Обработчик сообщений: Мы определяем лямбда-функцию, которая будет вызвана при инициализации диалогового окна, позволяя сбросить стиль окна после его создания.
Этот метод должен успешно скрыть значок диалога в панели задач. Не забудьте проверить, что вы правильно включили необходимые заголовочные файлы и используете соответствующую конфигурацию компилятора.