Come posso portare una finestra in primo piano in Vista usando C ++?

Ho un pezzo di codice che porta la finestra sotto il cursore in primo piano usando l’API SetForegroundWindow per WinXP. L’ho provato per Vista ma l’API sembra non svolgere più correttamente il lavoro.

AllowSetForeground non ha aiutato, il mio processo è un processo in background.

Cosa posso usare per realizzare questo?

Prova il seguente codice e vedi se funziona per te:

SetWindowPos(WndHandle,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE); SetWindowPos(WndHandle,HWND_NOTOPMOST,0,0,0,0,SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE); 

Solo un avvertimento: c’era una API pubblica per farlo (SetForegroundWindow), ora non porta più la finestra in primo piano.

Ora la finestra lampeggia.

Ma questo era per una ragione. Le applicazioni che lo fanno “rubano” l’attenzione dalla finestra corrente (spesso senza una buona ragione) e possono portare a tutti i tipi di problemi.

Quindi, prima di provare a eludere le protezioni messe dal sistema operativo contro questo tipo di comportamento, assicurati di non annoiare i tuoi utenti. Chiediti: “Devo davvero saltare sul viso del mio utente, anche se la mia applicazione è in background?”

Se si utilizza MFC, questo ha funzionato per me in Windows 7 x64:

  RECT rc; m_pMainWnd->GetWindowRect(&rc); int nBoxWidth = rc.left-rc.right; int nBoxHeight = rc.bottom-rc.top; int nBoxTop = rc.top; int nBoxLeft = rc.left; SetWindowPos(m_pMainWnd->GetSafeHwnd(), HWND_TOPMOST, nBoxLeft, nBoxTop, nBoxWidth, nBoxHeight, SWP_NOMOVE || SWP_NOSIZE); SetWindowPos(m_pMainWnd->GetSafeHwnd(), HWND_NOTOPMOST, nBoxLeft, nBoxTop, nBoxWidth, nBoxHeight, SWP_SHOWWINDOW || SWP_NOMOVE || SWP_NOSIZE); 

Se SetForegroundWindow() fallisce, hai provato a impostare la finestra WS_EX_TOPMOST e poi immediatamente non più in alto più a destra dopo aver chiamato SetForegroundWindow() ?

Potrebbe avere qualcosa a che fare con le persone che si lamentano giustamente delle applicazioni che spuntano dappertutto quando meno te lo aspetti.

 VOID SwitchToThisWindow(HWND hWnd, BOOL fAltTab); 

Funziona su XP a Windows 7 http://msdn.microsoft.com/en-us/library/ms633553.aspx

L’impostazione del thread corrente addormentato lo ha fatto per me, insieme con l’impostazione su non-topmost prima:

 OS.SetWindowPos(handle, OS.HWND_NOTOPMOST, 0, 0, 0, 0, OS.SWP_NOMOVE | OS.SWP_NOSIZE); try { Thread.sleep(100); } catch (InterruptedException e) { LOG.error("sleeping thread was interrupted", e); } OS.SetWindowPos(handle, OS.HWND_TOPMOST, 0, 0, 0, 0, OS.SWP_NOMOVE | OS.SWP_NOSIZE); 

utilizzare il programma tweakui di powertoys di Windows per modificare lo stato di authorization per lo stato attivo.

selezionare “generale” quindi “messa a fuoco” e quindi deselezionare la casella che consente agli altri programmi di concentrarsi.

Funziona quando i suggerimenti di tutti sembrano non funzionare, (in realtà tutti lo fanno).

microsoft nella loro infinita saggezza ha deciso che la risposta da chiamate a setforegrondwindow etc etc ora sarà nullo.

non si sono preoccupati di dire che puoi ancora tornare all’originale da tweakui !!!!

godere…..