2009-02-10 8 views

Répondre

7

Essayez le code suivant et voir si cela fonctionne pour vous:

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); 
+0

Cela me le fait pour - et a été la seule chose (à moins d'appeler ShowWindow avec MINIMIZE, puis ShowWindow avec RESTORE) qui a pour effet d'amener la fenêtre à l'avant.D'autres tentatives, y compris SetForegroundWindow et BringWindowToFront Just-Dont-Work, mais This-Approach-Does. –

+0

Vous tapez le mot "OU" ... est-ce pour éviter copier-pâtes par noobs? –

1

Si SetForegroundWindow() échoue, vous avez essayé de placer la fenêtre WS_EX_TOPMOST puis immédiatement dessus non plus à droite après avoir appelé SetForegroundWindow()?

Cela peut avoir quelque chose à voir avec des gens qui se plaignent à juste titre des applications qui apparaissent partout quand on s'y attend le moins.

0
VOID SwitchToThisWindow(HWND hWnd, BOOL fAltTab); 

Works sur XP vers Windows 7 http://msdn.microsoft.com/en-us/library/ms633553.aspx

+0

Malheureusement "[Cette fonction n'est pas destinée à un usage général, elle peut être altérée ou indisponible dans les versions ultérieures de Windows.]" :( –

2

Juste un avertissement: il y avait une API publique pour le faire (SetForegroundWindow), maintenant il ne fait pas la fenêtre au premier plan plus.

Maintenant, la fenêtre ne fait que clignoter.

Mais c'était pour une raison. Les applications faisant cela "volent" l'attention de la fenêtre courante (souvent sans raison valable) et peuvent conduire à toutes sortes de problèmes. Donc, avant d'essayer de contourner les protections mises par le système d'exploitation contre ce genre de comportement, assurez-vous de ne pas ennuyer vos utilisateurs. Demandez-vous: "est-ce que je dois vraiment vraiment sauter dans le visage de mon utilisateur, même si mon application est en arrière-plan?"

+2

Sans vouloir vous offenser, personnellement, je n'aime pas les réponses de ce genre. Pour concevoir son programme, il voulait une réponse à un problème technique spécifique – korona

+4

Eh bien, je vais répondre à cette question! L'une des choses les plus utiles qu'une réponse peut faire est de montrer au questionneur d'origine que peut-être la question qu'ils 're demandant indique qu'ils font la mauvaise chose – DavidK

+1

D'accord.La réponse n'est pas hors sujet et est pertinente :) –

1

Si vous utilisez MFC, cela a fonctionné pour moi dans 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); 
-3

fenêtres d'utilisation PowerToys programme TweakUI pour changer l'état de l'autorisation de mise au point.

Sélectionnez "Général" puis "Mise au point", puis décochez la case permettant à d'autres programmes de faire la mise au point.

Cela fonctionne lorsque les suggestions de tout le monde semblent ne pas fonctionner (elles le sont toutes). Microsoft dans leur sagesse infinie a décidé que la réponse des appels à setforegrondwindow etc etc sera maintenant nulle.

ils n'ont pas pris la peine de dire que vous pouvez toujours revenir à l'original par tweakui !!!!

profiter .....

0

Réglage du fil actuel, il a fait endormi pour moi, en même temps que la mise à non supérieure avant:

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); 
Questions connexes