2016-06-30 9 views
-1
m_pMainWnd->SetForegroundWindow(); 
m_pMainWnd->SetWindowPos(&CWnd::wndTop, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); 

Ich habe die obigen Zeilen benutzt, um eines meiner Fenster nach oben zu bringen. Aber zu meiner Enttäuschung passiert nichts. Obwohl < & CWnd :: wndTopMost> verwendet wird, bringen Sie das Fenster nach oben, aber keinen Fokus darauf. VS15, mfcWarum kommt ein Fenster nicht nach oben, obwohl setwindowpos verwendet wird?

+0

Könnte es eine Einschränkung von 'SetForegroundWindow' sein, d. H. Blinkt stattdessen der Taskleisteneintrag? –

+0

Ja, es blinkt, aber wie zu überwinden? –

+2

Wenn der Benutzer möchte, dass Ihr Fenster an der Spitze der Z-Reihenfolge steht, wechseln Sie zu diesem Fenster. Als Programmierer kontrollieren Sie nur die Anordnung von Fenstern innerhalb Ihrer Anwendung, nicht die Anordnung aller Fenster auf dem Desktop. –

Antwort

-2

Sie sollten CWnd :: wndTopMost anstelle von CWnd :: wndTop verwenden. CWnd :: wndTopMost bewirkt, dass das Fenster auch bei Deaktivierung oben bleibt.

Siehe Dokumentation: https://msdn.microsoft.com/en-us/library/a1yzfz6d.aspx

Eine alte neue Sache Artikel über den Unterschied zwischen den beiden: https://blogs.msdn.microsoft.com/oldnewthing/20051121-10/?p=33263

+0

TopMost behebt das Fenster oben. Wenn also eine andere Anwendung ausgeführt wird, bleibt das vorherige Fenster dort, was nicht akzeptabel ist. Alles, was ich will, ist, dass wenn meine App gestartet wird, sollte es oben und geöffnet sein, aber der Dialog für die Registrierung kommt im Hintergrund –

+1

Und ein anderer relevanter Artikel Old New Thing: [Wie erstelle ich ein oberstes Fenster, das nie abgedeckt ist durch andere oberste Fenster?] (https://blogs.msdn.microsoft.com/oldnewthing/20110310-00/?p=11253/) –

+0

Ich denke, ich habe Ihre eigentliche Frage missverstanden. Vielleicht könnten Sie das nächste Mal in der ursprünglichen Veröffentlichung weitere Details angeben, um Verwirrung zu vermeiden. – Jonathan

4

Es tut mir Leid, aber was Sie fragen, ist nicht (trivialer) möglich. Der Grund dafür, dass Ihr Fenster nicht in den Vordergrund tritt, ist, dass Ihre Anwendung nicht die Vordergrundanwendung ist (d. H. Die Anwendung, die für das Vordergrundfenster verantwortlich ist).

Vom manual page:

SetWindowPos Um ein Fenster nach oben zu bringen, den Prozess, der das Fenster besitzt SetForegroundWindow Erlaubnis haben muss.

Natürlich haben Sie das getan. Sie haben jedoch den Rückgabecode nicht überprüft. Hier ist, was das man page zu sagen hat:

Das System beschränkt, welche Prozesse das Vordergrundfenster festlegen können. Ein Prozess kann das Vordergrundfenster nur gesetzt, wenn eine der folgenden Bedingungen erfüllt ist:

  • Der Prozess der Vordergrundprozess ist.
  • Der Prozess wurde durch den Vordergrundprozess gestartet.
  • Der Prozess hat das letzte Eingabeereignis empfangen.
  • Es gibt keinen Vordergrundprozess.
  • Der Prozess wird debuggt.
  • Der Vordergrundprozess ist keine moderne Anwendung oder der Startbildschirm.
  • Der Vordergrund ist nicht gesperrt (siehe LockSetForegroundWindow).
  • Das Sperrzeitlimit für die Vordergrundverarbeitung ist abgelaufen (siehe SPI_GETFOREGROUNDLOCKTIMEOUT in SystemParametersInfo).
  • Keine Menüs sind aktiv.

Die Summe dieser Einschränkungen ist, dass, aller Wahrscheinlichkeit nach, Sie nicht Ihre Fenster in ein Vordergrundfenster drehen kann, und Sie können es nicht nach vorne bringen.

Es gibt Wege um das. Sie können sicherstellen, dass der Vordergrundprozess SetForegroundWindow aufruft. Leider führt das Ihren Code nicht aus.

Das einzige Mal, dass ich das tun musste, benutzte ich hooks, um meinen Code in den Vordergrund-Fensterprozess zu injizieren. Das ist kein Anfängertrick. Wenn du das nicht tust, gibt es keine Möglichkeit, das zu tun, was du versuchst.

Bearbeitet, um hinzuzufügen: Es gibt einen Grund, warum Windows versucht, Sie davon abzuhalten, das zu tun, was Sie versuchen zu tun. Das Stehlen des Fokus aus einer anderen Anwendung führt zu einer sehr schlechten Benutzeroberfläche für den Benutzer. Bitte überdenken Sie, ob Sie wollen zu tun, was Sie versuchen zu tun.

+0

* "Wenn Sie den Fokus von einer anderen Anwendung stehlen, entsteht für den Benutzer eine sehr schlechte Benutzeroberfläche." * - Aus diesem Grund hat Microsoft das Verhalten nicht geändert. Sie taten, weil die Eingabe in das Vordergrundfenster geht und das Stehlen des Vordergrundfensters bedeutet, dass Sie Ihre Kennwörter stehlen. Außerdem ist die Liste der Beschränkungen ziemlich ungenau, und das seit Jahren. Wenn es richtig wäre, dann wäre es einfach, das Vordergrundfenster zu setzen, einfach indem man alle Menüs schließt. – IInspectable

+0

Sie sprechen darüber, warum MS es so gemacht hat. Sie haben vielleicht Recht oder nicht (die gleiche Hooks-Technik wird auch Ihre Passwörter stehlen). Ich spreche darüber, warum Sie als Benutzer * es * nicht tun sollten. Sie können, aber Sie sollten immer noch nicht. –