Pregunta

Tema extraño:

  1. Abre una ventana grande de bloc de notas
  2. crear una ventana de herramientas (estilo WS_EX_TOOLWINDOW)
  3. crear 2 ventanas más (superpuestas normales) (WS_OVERLAPPED)
  4. cierre esas 2 ventanas superpuestas (hijo del escritorio o de la ventana de herramientas)
  5. la ventana de herramientas salta detrás de la ventana del bloc de notas

¿Alguien sabe por qué este es el caso? ¿O qué podría estar haciendo mal? Yo diría 'error en Windows', pero rara vez es el caso.

Para responder preguntas:

No es una ventana de diálogo, sino una ventana completa. Si hago que tenga hijos correctos (es decir, no es un hijo de escritorio), la entrada de la barra de tareas para los hijos no aparece (probablemente se puede corregir fácilmente), pero de cualquier manera, el error sigue ocurriendo.

He incluido un código de ejemplo que muestra el problema. Espero que solo esté creando la ventana de forma incorrecta o que deba responder a un mensaje al que no respondo.

En este ejemplo, se abrirá una ventana de herramientas (sin entrada en la barra de tareas, que es lo que se desea). Luego haces clic en esa ventana, se abrirá una subventana. Al hacer clic en la subventana, se abrirá otra ventana. Luego cierre las nuevas subventanas y la ventana original, en lugar de enfocarse, salta inmediatamente a otras ventanas (bloc de notas, etc.).

¡Gracias por cualquier ayuda!

Código de ejemplo para aclarar:

// 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);

}

¿Fue útil?

Solución

Esto no es sorprendente. De hecho, es exactamente el comportamiento que esperaría.

Tu ventana de herramientas no está saltando hacia abajo; Más bien, el Bloc de notas está saltando.

Cerró la ventana que tenía activación. El sistema activará la siguiente ventana de nivel superior en el orden z. Su ventana de herramientas no cuenta como una ventana de nivel superior en este sentido (eso es parte de lo que significa ser una ventana de herramientas). Así que el Bloc de notas se activa y llega a la parte superior.

Si quieres que tu ventana de herramientas se active en su lugar, probablemente no quieras una ventana de herramientas.

Otros consejos

¿Están los tres cuadros de diálogo de ventanas en otra ventana principal o son aplicaciones por derecho propio?

Si son ventanas de diálogo, verifico que su ventana principal esté asignada correctamente.

Si son ventanas de aplicaciones, compruebo que aparezcan en la barra de tareas.

Sin más información sobre el problema, es difícil dar una respuesta más significativa.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top