c ++ - BringWindowToTop virker ikke, selvom jeg får håndtaget til klassevindue

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg registrerer min klasse på følgende måde:


BOOL CNDSClientDlg::InitInstance()
{
    //Register Window Updated on 16th Nov 2010, @Subhen
    // Register our unique class name that we wish to use
    WNDCLASS wndcls;
    memset(&wndcls, 0, sizeof(WNDCLASS));

    wndcls.style = CS\_DBLCLKS | CS\_HREDRAW | CS\_VREDRAW;
    wndcls.lpfnWndProc  =  ::DefWindowProc; 
    wndcls.hInstance = AfxGetInstanceHandle();
    wndcls.hbrBackground = (HBRUSH)(COLOR\_WINDOW + 1);
    wndcls.lpszMenuName = NULL;

    //Class name for using FindWindow later
    wndcls.lpszClassName = \_T("CNDSClientDlg");
    // Register new class and exit if it fails

    if(!AfxRegisterClass(&wndcls)) // [C]

    {
        return FALSE;
    }
}


og derefter kalder InitInstance-metoden og skaber vinduet i konstruktøren af ​​klassen:


CNDSClientDlg::CNDSClientDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CNDSClientDlg::IDD, pParent)

{
InitInstance();

    HWND hWnd;
    hInst = AfxGetInstanceHandle(); // Store instance handle in our global variable
    hWnd = CreateWindow(\_T("CNDSClientDlg"), "NDS", WS\_OVERLAPPEDWINDOW,
                        CW\_USEDEFAULT, 0, CW\_USEDEFAULT, 0, NULL, NULL, hInst, NULL);


}


Nu i mit andet program finder jeg vinduet og forsøger at bringe til toppen:


Rediger
Kunne bringe newlyCreated Windows med nedenstående kode


 CWnd *pWndPrev = NULL;
                    CWnd *FirstChildhWnd = NULL;
                    pWndPrev = CWnd::FindWindow(\_T("CNDSClientDlg"),NULL);
                    if(pWndPrev != NULL)
                    {
                        //pWndPrev->BringWindowToTop();
                        WINDOWPLACEMENT wndplacement;
                        pWndPrev->GetWindowPlacement(&wndplacement);
                        wndplacement.showCmd = SW\_RESTORE;
                        pWndPrev->SetWindowPlacement(&wndplacement);
                        pWndPrev->SetForegroundWindow();

                        FirstChildhWnd = pWndPrev->GetLastActivePopup();
                        if (pWndPrev != FirstChildhWnd)
                        {
                            // a pop-up window is active, bring it to the top too
                            FirstChildhWnd->GetWindowPlacement(&wndplacement);
                            wndplacement.showCmd = SW\_RESTORE;
                            FirstChildhWnd->SetWindowPlacement(&wndplacement);
                            FirstChildhWnd->SetForegroundWindow();
                        }


Jeg kan finde vinduet da pWndPrev ikke er NULL, men det bringer ikke min ansøgning til front. Skal jeg registrere nogen anden klasse I stedet for CNDSClientDlg. Jeg ønsker at bringe min MFC-applikation øverst.

Bedste reference


Et par ting at se på ...


1) Prøv SetForegroundWindow () i stedet for BringWindowToTop (). Det har været et stykke tid siden jeg har lavet Win32 programmering, men jeg synes at huske at BringWindowToTop () har nogle begrænsninger (især når man arbejder med Windows i forskellige processer).


2) Der er nogle regler, som Microsoft har indført vedrørende SetForegroundWindow () startende med Windows 2000. Den korte version er, at kun den forreste applikation kan ændre forgrundsvinduet. Ideen er, at en applikation, der ikke er den mest fremtrædende, ikke kan 'springe foran' den aktive applikation. Hvis en baggrundsapplikation kalder SetForegroundWindow (), vil Windows blinke proceslinjeknappen til appen, men vil ikke rent faktisk bringe appen til fronten. Brugeren skal gøre det. Jeg oversimplificerer reglerne, men det kan være noget at se på, afhængigt af dit specifikke scenario.

Andre referencer 1


BringWindowToTop () virker kun, hvis opkaldsprocessen er forgrundsprocessen, eller hvis den modtog den sidste indtastningsbegivenhed. [6] [7]


Ring CWnd :: SetForegroundWindow () i stedet. [8]

Andre referencer 2


Du skal muligvis kalde AllowSetForegroundWindow i dit 'andre' program, før du kalder SetForegroundWindow. [9]


Det forudsættes, at din anden applikation er forgrunds-appen, og forsøger at videregive sin forgrundsstatus til applikationen med vinduet.


Hvis hverken app er forgrunden app, så er du ikke formodentlig for at kunne bringe et vindue foran, selv om der er måder at gøre det (både ved et uheld og med vilje).

Andre referencer 3


SetWindowPos(&wndTopMost, -1, -1, -1, -1,  SWP\_NOMOVE | SWP\_NOSIZE | SWP\_SHOWWINDOW);
SetForegroundWindow();