2013-09-06 12 views
6

Situation: Ein border-less QDialog bleibt erfolgreich über anderen Anwendungen.Vermeiden Sie die Aktivierung von Anwendungen und fokussieren Sie, wenn Sie darauf klicken - Windows API oder Qt

Das Problem ist, wenn auf dieser always-on-top-Anwendungsfenster klicken, geschieht Folgendes:

  • Die geklickt always-on-top-Anwendung
  • Die geklickt always-on-top aktiviert wird Anwendung Fenster stiehlt den Fokus der bisherigen aktiven/fokussierter App

gibt es eine Möglichkeit, dass, wenn auf dieser always-on-top inaktiv und unkonzentriert Anwendungsfenster klicken,

  • die aktuelle Anwendung nicht verlieren Aktivierung und Fokus
  • während der Benutzer immer noch in der Lage zu interagieren mit der immer-auf-der-Anwendung (Knöpfe oder Dropdown-Menüs treffen, ziehen Sie das Fenster)?

Ich arbeite mit Qt, aber es gibt kein Problem mit der nativen Windows-API.

ich folgende Qt windowFlag versucht:

  • Qt::WindowDoesNotAcceptFocus, aber es funktioniert nicht: die Always-on-top-Anwendung aktiviert ist, fokussiert.
  • Qt::WindowTransparentForInput, die Always-on-Top-Anwendung ist wirklich transparent für Klicks: nicht aktiviert und nicht fokussiert in, aber Tasten werden leider nicht ausgelöst, wenn sie getroffen werden.

Antwort

5

Es ist möglich, ein Fenster unaktivierbar und unfokussierbar zu machen, wenn Sie darauf klicken, indem Sie Windows-Flags (#include <qt_windows.h>) verwenden. Die folgende muss verwendet werden, nachdem das Fenster erstellt und gezeigt:

HWND winHandle = (HWND)winId(); 
ShowWindow(winHandle, SW_HIDE); 
SetWindowLong(winHandle, GWL_EXSTYLE, GetWindowLong(winHandle, GWL_EXSTYLE) 
    | WS_EX_NOACTIVATE | WS_EX_APPWINDOW); 
ShowWindow(winHandle, SW_SHOW); 
+0

Hm, wie machst du das in Qt sowieso? "WinEvents" überschreiben? – swdev

+1

Sie können 'showEvent()' überschreiben. Rufen Sie für die Implementierung zuerst die übergeordnete Methode und dann den obigen Code auf. – Derek

+0

Nicht erfolgreich :) Ich habe bereits Erfolg bei der Portierung des Codes auf PyQt mit PyWin-Bibliotheken, überschreiben 'showEvent()', aber wenn ich auf dieses annehmen-zu-nicht-aktive Fenster klicken, wird mein Hauptfenster inaktiv. Irgendeine Idee? – swdev

1

Ich weiß nicht, über QDialog, ich verwende nur ein QWidget ähnlichen Zweck (ein Windows-8-Stil Benachrichtigung angezeigt wird).

Try Einstellung:

dialog->setFocusPolicy(Qt::NoFocus); 
dialog->setAttribute(Qt::WA_ShowWithoutActivating); 

vielleicht werden Sie haben Fokus Politik auf alle Kinder setzen.

+0

Dank headsvk aber es wird durch die immer an der Spitze Flagge außer Kraft gesetzt: 'Dialog-> setWindowFlags (windowFlags() | Qt :: WindowStaysOnTopHint);' Es scheint, dass dieses Flag mit dem Attribut "Qt :: WA_ShowWithoutActivating" in Konflikt steht. – Derek

+0

In der Tat funktioniert es überhaupt nicht auf Windows (auch ohne die WindowStaysOnTopHint), während auf dem Mac gibt es den Konflikt. Getestet habe ich mit einem MainWindow, dann einem QDialog und schließlich mit einem QWidget. – Derek

+0

Ich verwende auch 'Qt :: WindowStaysOnTopHint'. Also habe ich versucht, eine Schaltfläche zu meinem Popup hinzuzufügen und wenn ich darauf klicke, wird der Fokus nicht von meinem aktiven Fenster gestohlen. Wie widersprechen sich die Flaggen? – headsvk