Pergunta

problema estranho:

  1. Abra uma janela do bloco de notas grande
  2. criar um toolwindow (WS_EX_TOOLWINDOW estilo)
  3. criar mais 2 janelas (sobrepostas normal) (WS_OVERLAPPED)
  4. Feche os 2 janelas sobrepostas (filho de desktop ou o toolwindow)
  5. o toolwindow salta atrás da janela do bloco de notas

Alguém sabe por que este é o caso? Ou o que eu poderia estar fazendo de errado? Eu diria 'bug no Windows', mas que raramente é o caso.

Para responder às perguntas:

Não é uma janela de diálogo, mas uma janela completa. Se eu torná-lo ter filhos corretas (ie: sem crianca da área de trabalho), a entrada da barra de tarefas para as crianças não aparecem (provavelmente facilmente solucionáveis), mas de qualquer forma, o bug ainda acontece.

Eu incluí exemplo de código que mostra a questão. Eu estou esperando que eu apenas estou criando o errado janela ou necessário para responder a uma mensagem que eu não estou respondendo.

Neste exemplo, uma janela de ferramenta será aberta (sem entrada barra de tarefas, que é o que é desejado). Em seguida, clicar em que a janela, uma sub-janela será aberta. Você clica no sub-janela, outra janela será aberta. Em seguida, feche os dois novos sub-janelas e a janela original, em vez de conseguir foco, salta imediatamente para trás outras janelas (bloco de notas, etc).

Obrigado por qualquer ajuda!

código exemplo para esclarecer:

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

}

Foi útil?

Solução

Isto não é surpreendente. Na verdade, é exatamente o comportamento que eu esperaria.

Você janela está ferramenta é não saltar para baixo; em vez Notepad está saltando para cima.

Você fechou a janela que tinha ativação. O sistema vai ativar a janela de próxima maior de nível superior na ordem z. Sua janela de ferramenta não uma contagem como uma janela de nível superior a este respeito (que é parte do que é ser um meio de janelas de ferramentas). Assim, o Bloco de notas é ativado, e ele vem para o topo.

Se você quiser que o seu janela de ferramenta para ser ativada em vez disso, você provavelmente não quer realmente uma janela de ferramenta.

Outras dicas

Os três diálogos Windows para outra janela principal ou são aplicações em seu próprio direito?

Se eles são janelas de diálogo, então eu iria verificar se a sua janela pai está correctamente atribuído.

Se eles são janelas de aplicativos, então eu iria verificar se eles estão aparecendo na barra de tarefas.

Sem mais informações sobre o problema é difícil dar uma resposta mais significativa.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top