Domanda

Strano problema:

  1. Apri una grande finestra di blocco note
  2. crea una finestra degli strumenti (stile WS_EX_TOOLWINDOW)
  3. crea altre 2 finestre (normalmente sovrapposte) (WS_OVERLAPPED)
  4. chiudi quelle 2 finestre sovrapposte (figlio del desktop o della finestra degli strumenti)
  5. la finestra degli strumenti salta dietro la finestra del blocco note

Qualcuno sa perché questo è il caso? O cosa potrei fare di sbagliato? Direi "bug in windows", ma raramente è così.

Per rispondere alle domande:

Non è una finestra di dialogo, ma una finestra intera. Se lo faccio avere figli corretti (cioè: non un figlio del desktop), la voce della barra delle attività per i bambini non appare (probabilmente facilmente risolvibile), ma in entrambi i casi, il bug si verifica ancora.

Ho incluso un codice di esempio che mostra il problema. Spero di aver creato la finestra in modo errato o di dover rispondere a un messaggio a cui non rispondo.

In questo esempio, si aprirà una finestra degli strumenti (nessuna voce nella barra delle attività, che è ciò che si desidera). Quindi fai clic su quella finestra, si aprirà una finestra secondaria. Fai clic sulla finestra secondaria, si aprirà un'altra finestra. Quindi chiudi sia i nuovi sottofinestra sia la finestra originale, invece di ottenere lo stato attivo, passa immediatamente alle altre finestre (blocco note, ecc.).

Grazie per l'aiuto!

Codice di esempio da chiarire:

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

}

È stato utile?

Soluzione

Questo non è sorprendente. In realtà, è esattamente il comportamento che mi aspetto.

La finestra degli strumenti non sta saltando giù; piuttosto Blocco note sta saltando su.

Hai chiuso la finestra con l'attivazione. Il sistema attiverà la finestra di livello superiore successiva più alta nell'ordine z. La finestra degli strumenti non viene considerata come una finestra di livello superiore in questo senso (fa parte di ciò che significa essere una finestra degli strumenti). Quindi Blocco note viene attivato e arriva in cima.

Se invece vuoi attivare la tua finestra degli strumenti, probabilmente non vuoi davvero una finestra degli strumenti.

Altri suggerimenti

Le tre finestre di dialogo si trovano su un'altra finestra principale o sono applicazioni a sé stanti?

Se sono finestre di dialogo, verificherei che la loro finestra principale sia assegnata correttamente.

Se sono finestre dell'applicazione, verificherei che vengano visualizzate nella barra delle applicazioni.

Senza ulteriori informazioni sul problema, è difficile dare una risposta più significativa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top