PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [WIN32] Focus Stealing verhindern?


Nasenbaer
2011-11-19, 21:53:14
Moin,
gibt es über die WinAPI ne Möglichkeit ein Vollbildfenster so zu konfigurieren, dass andere Anwendungen dieses nicht minimieren können? Ich mein vorallem solche Info-Fenster wie die von Avira FreeAV, die quasi jede Vollbildanwendung zur Minimierung zwingen. Oder das Fenster das erscheint, wenn man nen USB-Stick ransteckt.

Habe das Problem unter Windows 7 und möchte meine Anwendungen so basteln, dass diese nur auf ALT+TAB reagiert. Blockieren der Windows-Taste wäre in dem Zusammenhang auch ganz praktisch.


Weiß jemand was man dazu einstellen muss?

Nasenbaer
2011-11-20, 16:56:10
Keine nen Tipp? Google findet nur Registry-Hacks wie man das verhindern können soll für alle Anwendungen aber die gehen ab Win7 leider nicht mehr.

ENKORE
2011-11-20, 17:15:27
Tastaturfiltertreiber schreiben

Bei WM_KILLFOCUS wieder WM_SETFOCUS aufs eigene Fenster ausführen.

Ectoplasma
2011-11-21, 12:29:09
Tastaturfiltertreiber schreiben

Bei WM_KILLFOCUS wieder WM_SETFOCUS aufs eigene Fenster ausführen.

Ziemlich bösartige Lösung. Wenn du da einen Fehler machst, dann kommst du evtl. gar nicht mehr aus der Anwendung raus. Das kann nicht im Sinne des Erfinders sein.

Man könnte z.B. stattdessen eine Hook-DLL bauen, die es nur bestimmten Anwendungen verbietet APIs zu nutzen, die Fenster von anderen Anwendungen beinflussen können.

Eigentlich gibt es keinen richtigen Tipp. Du kannst dich nur bei denen beschweren, die solche Anwendungen bauen.

ENKORE
2011-11-21, 19:29:44
Ziemlich bösartige Lösung.:devil:

Nasenbaer
2011-11-21, 19:56:58
Es geht mir bspw. darum, dass XBMC immer durch Antivir minimiert wird. Aber auch einige andere Opensource-Anwendungen und natürlich meine eigenen. Und da dacht ich halt machst einfach selbst. :)

Aber hook-DLLs baue ich dafür sicher nicht.Aber hast schon recht - was macht man wenn man selbst mal minimieren will? Mein User-Ereignis kann man diesen Mechanismus natürlich temporär deaktivieren. Jo so werde ich das machen - einfach nen Knopf definieren womit man diesen Mechanimus deaktivieren kann. Nicht sehr schön aber erfüllt seinen Zweck vollkommen und für privat genutzten Kram mehr als ausreichend.

seaFs
2011-11-21, 20:27:34
Für WinXP gibt es ja TweakUI, mit dem man z.B. das SystemAutoPlay deaktivieren kann. Evtl gibt es etwas vergleichbares ja auch für Windows 7. Damit könntest du dann dein USB-Problem lösen.

Und soweit ich mich erinnere, konnte man auch von Antivir das Popupdingens mit ein paar "Hacks" ausmachen (Registry-Eintrag oder Datei löschen...)

Monger
2011-11-21, 21:29:55
Selbst wenn sich ein schmutziger Hack findet: so gedacht ist das sicher nicht.

Microsoft betont an verschiedenen Stellen, dass das Setzen des Fensterfokus nur ein Kann, kein Muss ist. Das Betriebssystem entscheidet letztendlich, welches Fenster im Vordergrund ist. Eine Anwendung kann den Fokus erbitten, aber es liegt im Ermessen des Betriebssystem diesen zu geben oder wieder zu entziehen.

Selbst wenn du etwas findest was den Fokus erzwingt, wäre das undokumentiertes Verhalten, was sich mit jedem Windows Patch wieder ändern kann.

Du kannst natürlich den Tray benutzen um Meldungen abzusetzen. Es gibt auch sowas wie Balloon Tips, die sich als Overlay vorne dran schieben. Versuch mal darüber was rauszufinden, weil über die klassischen Windows Fenster wird das eine wacklige Angelegenheit.

Nasenbaer
2011-11-21, 22:30:28
Das Problem ist das jedes aufpoppende Fenster, jedes Irgendwas, manche Vollbild-Anwendungen minimiert. Manch andere Anwendung zeigt sich davon aber unbeeindruckt. Deswegen glaube ich eher das die WindowClass bspw. nicht mit den richtigen Parameters versehen wurde.

EDIT: Aber es kann auch sein, dass sich mit Win7 grundsätzlich was bei der Fokus-Behandlung getan hat. Die alten XP-Registryhacks, die alle vorschlagen, gehen mit 7 bspw. auch nicht mehr.

Nasenbaer
2011-11-26, 17:16:44
Hmm jetzt bin ich ratlos.

Hab mich durch den XBMC-Quellcode gewuselt und die Message-Behandlung gefunden. Problem: Weder WM_SHOWWINDOW, WM_KILLFOCUS noch WM_SIZE werden geschickt, wenn Antivirs Updatedialog die Anwendung minimiert. Beim Starten komme ich dagegen schon an diesen Breakpoints an, d.h. richtig gesetzt sind sie.

Irgendwelche Ideen?

Der_Donnervogel
2011-11-26, 18:52:00
Vielleicht suchst du mal unter dem Begriff "Always on top" auf Google. Ich kenne das Thema zumindest unter dem Begriff. Eine kurze Recherche hat folgendes

http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/59d83819-0e23-4d80-8157-568e0fe9f3c2

ausgespuckt. Viellleicht hilfts ja. Ich programmiere eigentlich nie direkt mit der Windows API und kenne mich deshalb damit nicht aus.

Nasenbaer
2011-11-26, 20:44:43
SetWindowPos mit HWND_TOPMOST bringt leider auch nicht den erwünschten Effekt.
Wenn ich z.B. XBMC im Fenster laufen lasse und auf ein anderes Fenster klicke, dann wird zwar nun SetWindowPos(..., HWND_TOPMOST, ...) und SetFocus(hwnd) ausgeführt aber bringt das Fenster nur manchmal in den Vordergrund und den Keyboard-Fokus erhält es nie.

@Monger
Hast also völlig Recht, dass die Fokus-Messages nichts als Hints an den Windows-Fenstermanager sind.

Ich werde das Problem also bei Gelegenheit mal mit einen kleinen Test-Applikation genauer untersuchen müssen. XBMC ist zum Debuggen solcher Probleme zu unübersichtlich.