WS_EX_TOOLWINDOW переходит в фоновый режим при уничтожении окна

Странная проблема:

  1. Откройте большое окно блокнота
  2. создать окно инструментов (стиль WS_EX_TOOLWINDOW)
  3. создать еще 2 окна (нормальное перекрытие) (WS_OVERLAPPED)
  4. закройте эти 2 перекрывающихся окна (дочерний элемент рабочего стола или окна инструментов)
  5. окно инструментов прыгает за окно блокнота

Кто-нибудь знает, почему это так? Или что я мог делать не так? Я бы сказал «ошибка в Windows», но это случается редко.

Чтобы ответить на вопросы:

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

Я включил пример кода, который показывает проблему. Я надеюсь, что я просто неправильно создаю окно или мне нужно ответить на сообщение, на которое я не отвечаю.

В этом примере откроется окно инструмента (без записи на панели задач, а это то, что нужно). Затем вы щелкаете по этому окну, откроется подокно. Вы нажимаете на подокно, откроется другое окно. Затем закройте и новые подокна, и исходное окно, вместо того, чтобы получать фокус, сразу перескакивает за другие окна (блокнот и т. д.).

Спасибо за любую помощь!

Пример кода для пояснения:

// WindowToback.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "WindowToback.h"

// Global Variables:
HINSTANCE g_instance;
HWND g_mainWnd = NULL;

wchar_t *szWindowClass = L"WindowToBackSub";
wchar_t *szWindowClass2 = L"WindowToBackSub2";

ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK    WndProc2(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

int APIENTRY _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    MSG msg;

    MyRegisterClass(hInstance);

// Perform application initialization:
if (!InitInstance (hInstance, nCmdShow))
{
    return FALSE;
}

// Main message loop:
while (GetMessage(&msg, NULL, 0, 0))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

return (int) msg.wParam;
}


ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;

wcex.cbSize = sizeof(WNDCLASSEX);

wcex.style          = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc    = WndProc;
wcex.cbClsExtra     = 0;
wcex.cbWndExtra     = 0;
wcex.hInstance      = hInstance;
wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWTOBACK));
wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName   = MAKEINTRESOURCE(IDC_WINDOWTOBACK);
wcex.lpszClassName  = szWindowClass;
wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

RegisterClassEx(&wcex);

wcex.lpfnWndProc    = WndProc2;
wcex.lpszClassName  = szWindowClass2;

return RegisterClassEx(&wcex);
}

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   g_instance = hInstance; 
   g_mainWnd = CreateWindowEx(WS_EX_TOOLWINDOW,szWindowClass, szWindowClass,WS_OVERLAPPED,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

   if (!g_mainWnd) return FALSE;

   ShowWindow(g_mainWnd, nCmdShow);
   UpdateWindow(g_mainWnd);

   return TRUE;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
    case WM_LBUTTONDOWN:
    {
        HWND l_hwnd = CreateWindow(szWindowClass2, szWindowClass2, WS_VISIBLE | WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, g_instance, NULL);
        ShowWindow(l_hwnd,SW_SHOW);
        break;
    }

    case WM_DESTROY:
    {
        PostQuitMessage(0);
        return 0;
    }
}

return DefWindowProc(hWnd, message, wParam, lParam);
}

LRESULT CALLBACK WndProc2(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
    case WM_LBUTTONDOWN:
    {
        HWND l_hwnd = CreateWindow(szWindowClass2, szWindowClass2, WS_VISIBLE | WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, g_instance, NULL);
        ShowWindow(l_hwnd,SW_SHOW);
    }
    break;
}

return DefWindowProc(hWnd, message, wParam, lParam);

}

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
2 556
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Являются ли эти три окна диалога другим главным окном или они являются самостоятельными приложениями?

Если это диалоговые окна, я бы проверил, правильно ли назначено их родительское окно.

Если это окна приложений, я бы проверил, появляются ли они на панели задач.

Без дополнительной информации о проблеме трудно дать более содержательный ответ.

Я обновил вопрос, чтобы включить дополнительную информацию. Спасибо за ответ!

Bob 08.10.2008 17:24
Ответ принят как подходящий

Это не удивительно. Фактически, это именно то поведение, которого я ожидал.

Окно вашего инструмента не скачет вниз; скорее Блокнот подпрыгивает.

Вы закрыли окно, в котором была активация. Система собирается активировать следующее по высоте окно верхнего уровня в z-порядке. В этом отношении окно вашего инструмента не считается окном верхнего уровня (это часть того, что означает быть окном инструментов). Итак, Блокнот активируется, и он оказывается наверху.

Если вы хотите, чтобы вместо этого активировалось окно инструментов, вам, вероятно, действительно не нужно окно инструментов.

Другие вопросы по теме