Focus bei bestimmten Fenstern verhindern - eine echt harte Nuss

  • Hallo Freunde der automatisierten Schritte,

    zur Abwechslung mal eine wirklich harte Nuss :)

    Messageboxen und Benachrichtungen aller Art von den verschiedensten Programmen erscheinen im Vordergrund und erhalten automatisch den Focus. Das in Windows komplett zu deaktivieren geht nicht, da dann andere Programme, die diese Eigenschaft verwenden, nicht mehr funktionieren.

    Wenn man in dem Moment gerade etwas schreibt (was häufig vorkommt :) ), dann bestätigt man mit Enter / Leertaste etc. die Messagebox bzw. die Benachrichtigung und löst z.T. ungewollte Schritte aus.

    Kennt Ihr das Problem?

    Sei es eine einfache Termin-Erinnerung, die man so wegklickt, sei es eine Bestätigung zum Löschen der Festplatte ;)

    Meine Frage gliedert sich in 2 Teile:

    (a) Wie erzeuge ich mit AutoIt einfache, in unterschiedlichen Scripten wiederverwendbare Benachrichtungen mit anklickbaren Messagebox-Button, die bei Anzeige nicht den Focus erhalten haben? Also die nur auf einen Mausklick reagieren, aber nicht auf ein "versehentliches" Tastaturereignis?

    (b) Wie verhindere ich systemweit, dass Tastatureingaben zur ungewollten Bestätigung von Messageboxen etc. führen?

    Eine erste Idee, ein Autoit-Script läuft ständig im Hintergrund und nimmt in einer ini-Datei hinterlegten Fenstern den Focus. Dazu müsste es schneller sein, als ich tippe :) Abgesehen davon, habe ich keine Idee, wie das umsetzbar wäre.

    Vielleicht habt Ihr eine Idee?

    Viele Grüße
    AutoMit

  • Schreib nen eigenes Fenster, das den Aufbau der MSGBOX hat. dann kannst du damit machen was du willst

    Nur wie? Hier ist ein entsprechendes Fenster und es reagiert auf die Tastatur - wie kann ich das verhindern?

    Spoiler anzeigen

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

    $Form1 = GUICreate("Dialog", 289, 201, 349, 249)
    $GroupBox1 = GUICtrlCreateGroup("", -9, -28, 297, 193)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $Button1 = GUICtrlCreateButton("&OK", 53, 174, 75, 25)
    $Button2 = GUICtrlCreateButton("&Cancel", 132, 175, 75, 25)
    $Button3 = GUICtrlCreateButton("&Help", 212, 175, 75, 25)
    GUISetState(@SW_SHOW)

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

    EndSwitch
    WEnd


    Systemweit: wüsst ich so nicht... der Titel kann ja immer variieren...

    Es betrifft gefühlte 30 Fenster, von denen man mit Au3Info_x64.exe sicherlich die Eigenschaften auslesen könnte. Da würde dann nichts variieren. Nur wie weiter?

  • setz die gui mal mit GUISetState(@SW_SHOWNOACTIVATE), statt @SW_SHOW. die gui sollte dann nicht in den Vordergrund gelangen, ansonsten: GuiSetState(@SW_DISABLE) für ne bestimmte zeit, z.B. bis die maus geklickt hat, der so :)

    Das andere:

  • Das bringt mich ja fast vom Glauben ab :)

    für Autoit Fenster ist das wirklich schon die Lösung - vielen Dank Kanashius

    GUISetState(@SW_SHOWNOACTIVATE)

    Kann man externe Fenster genauso leicht manipulieren, indem man ihnen diese Eigenschaft @SW_SHOWNOACTIVATE gibt? Wenn ja, wie?

    (falls Teil 2 auch so einfach zu lösen ist, war die Nuss wirklich nicht hart ;)

  • Also die nur auf einen Mausklick reagieren, aber nicht auf ein "versehentliches" Tastaturereignis?

    Probleme löst man nicht, Probleme beseitigt man!
    Zum Thema "Mausklicks" solltest du in JEDEM hier im Forum geposteten Thread zum Thema den Hinweis finden, dass "Mausklicks" die mit Abstand schlechteste Lösung ist, um Ereignisse von Controls auszulösen! ControlClick() ist dein Freund, damit ist nämlich völlig unerheblich, welches Fenster den Focus hat!

    (b) Wie verhindere ich systemweit, dass Tastatureingaben zur ungewollten Bestätigung von Messageboxen etc. führen?

    Wozu? Windows ist nicht umsonst ein MultiTasking/MultiThreading-System! Selbst in seligen DOS-Zeiten gab es TSR-Programme, die "nebenbei" liefen...
    Wenn du nicht auf den Bildschirm schaust, während du schreibst, solltest du dir das angewöhnen! Die Frage stellt sich, wie Milliarden von Computeranwendern in den letzten 30 Jahren dein "Problem" bearbeitet haben?

    Umgekehrt wird ein Schuh draus, sorge dafür, dass erst gar kein "Fremdprogramm" deine Tastatureingaben stört. Ich jedenfalls habe keine Programme laufen, welche irgendwelche extrem diffizilen Messageboxen aufpoppen lassen, die eine destruktive Funktion mit ENTER/OK bestätigt bekommen.

  • @ andy
    du hast auch keinen Virus der Dich per Pop up fragt ob er die Platte löschen darf :rofl:

    Gruß

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Umgekehrt wird ein Schuh draus, sorge dafür, dass erst gar kein "Fremdprogramm" deine Tastatureingaben stört. Ich jedenfalls habe keine Programme laufen, welche irgendwelche extrem diffizilen Messageboxen aufpoppen lassen, die eine destruktive Funktion mit ENTER/OK bestätigt bekommen.

    Ich schreibe nicht im Geier-Such-System, sondern relativ schnell und schaue dabei natürlich auf den Monitor. Eine Messagebox ist da schneller durch eine Leertaste geschlossen, als ich die wahrnehmen konnte.

    Ich habe viele Programme zu laufen, die Nachrichten bringen. Z.B. Terminkalender, Anrufmonitor, Chat und mehr. Von Programmen "namhafter" Hersteller, die in einen Fehler laufen und das durch eine Messagebox kundtun, ganz zu schweigen.

    Auf die Programme kann oder möchte ich nicht verzichten. Es geht nicht um destruktive Funktionen, sondern darum, ich dass ich den Inhalt der Messageboxen lesen möchte und zum Teil lesen muss.

    Und die verschwinden eben dadurch, dass ich einen Text schreibe, während die Messageboxen aufpoppen.

    "Probleme löst man nicht, Probleme beseitigt man!"

    Problem: durch den User geschlossene Messageboxen

    Problem beseitigt: offene Messageboxen (User tot) ... ob das die Lösung ist?

    Suchen wir eine wirkliche Lösung.

    Erste sehr gute Ansätze zum Thema schrieb Kanashius, danke dafür. Die systemweite Umsetzung gelang mir (noch) nicht.

    (Ob Millarden von Computeranwendern das gleiche Problem haben oder nicht, spielt keine Rolle. Die wenigsten Menschen wissen von ihren Problemen. Genug off topic.)

    Zum Thema "Mausklicks" solltest du in JEDEM hier im Forum geposteten Thread zum Thema den Hinweis finden, dass "Mausklicks" die mit Abstand schlechteste Lösung ist, um Ereignisse von Controls auszulösen! ControlClick() ist dein Freund, damit ist nämlich völlig unerheblich, welches Fenster den Focus hat!

    Du irrst :) Ich möchte in Autoit ein Fenster als Messagebox erstellen, welches nicht auf User Tastatureingaben reagiert, sondern nur auf einen per Hand ausgelösten Mausklick. Das ist das ein Teil dieses Thema.

  • Du irrst Ich möchte in Autoit ein Fenster als Messagebox erstellen, welches nicht auf User Tastatureingaben reagiert, sondern nur auf einen per Hand ausgelösten Mausklick. Das ist das ein Teil dieses Thema.

    und warum machst du das nicht? Erstelle ein Fenster, erstelle Buttons, welche ausschliesslich auf Mausklicks reagieren, fertig!
    Spannend wird es, wenn das Fenster auf keinerlei Tastatureingaben ( ALT+F4, ALT+TAB usw.) reagieren soll, da solltest du dich intensiv mit dem Messagesystem von Windows auseinandersetzen...

  • Ich habe viele Programme zu laufen, die Nachrichten bringen. Z.B. Terminkalender, Anrufmonitor, Chat und mehr. Von Programmen "namhafter" Hersteller, die in einen Fehler laufen und das durch eine Messagebox kundtun, ganz zu schweigen.

    Auf die Programme kann oder möchte ich nicht verzichten. Es geht nicht um destruktive Funktionen, sondern darum, ich dass ich den Inhalt der Messageboxen lesen möchte und zum Teil lesen muss.

    (Ob Millarden von Computeranwendern das gleiche Problem haben oder nicht, spielt keine Rolle. Die wenigsten Menschen wissen von ihren Problemen.

    Und ob das eine Rolle spielt! Genau das ist dein Problem, dass du nur aus deiner Sichtweise herangehst. Wenn Milliarden von Anwendern identische "Probleme" haben, diese aber ggf. auf anderem Weg als den von dir vorgesehenem lösen, wieso schiebst du diese "Lösungen" als nicht für dich relevant zur Seite?

    Übrigens ist es recht seltsam, dass gerade du behauptest, dass die wenigsten Menschen von ihren Problemen wissen! Wie kommst du dazu?

  • Übrigens ist es recht seltsam, dass gerade du behauptest, dass die wenigsten Menschen von ihren Problemen wissen! Wie kommst du dazu?

    Das zeigt mir der tägliche Umgang mit Menschen ... und ja, auch Dein Verhalten.

    Ich möchte das nicht tiefenpsychologisch ausweiten - es ist off topic.

    PS: So sehr ich Deine Arbeit und Deine Autoit-Fähigkeiten schätze, schon in Post 5 steht, dass ich das Messageboxfenster bereits habe. Du hast das mehrfach falsch verstanden und reitest noch in Post 11 drauf rum.

    Teil 2 der Anfrage ist offen. Mein Ziel ist es, dass alle Messageboxen fremder Programme nicht auf meine Tastatureingaben reagieren. Mein Ziel ist es nicht, auf diese Programme zu verzichten. Wenn Du eine zielführende Antwort hast, freue ich mich darüber. Und ich möchte nicht darüber dikutieren, wie Du meine Zielsetzung findest. Wenn es für Dich eine Lösung ist, auf die Programme zu verzichten - sei es so. Für mich ist das keine Lösung.

    Natürlich gehe ich von meiner Sichtweite heran, denn ich weiß, was ich nutzen möchte und was nicht.

    Und ich schreibe Dir auch nicht vor, welchen Weg Du gehen darfst.

    Also schalten wir wieder einen Gang zurück und lassen die Machtspiele.

  • Eine erste Idee, ein Autoit-Script läuft ständig im Hintergrund und nimmt in einer ini-Datei hinterlegten Fenstern den Focus. Dazu müsste es schneller sein, als ich tippe Abgesehen davon, habe ich keine Idee, wie das umsetzbar wäre.


    Hallo @AutoMit
    Mein Vorschlag für die anderen Fenster:
    Könntest du es nicht umgekehrt machen? Du nimmst ein Fenster in den Fokus und sorgst dafür, dass dein Skript diesen Vorgang in sehr schneller Folge wiederholt? So musst du dich nicht um alle möglichen Programme kümmern, sondern nur um das, welches du zum Schreiben nutzt.

    Unten habe ich einfach mal eine leichte Anpassung des WinActivate-Beispiels aus der Hilfe genommen.
    Wenn du unterschiedliche Programme in den Fokus nehmen willst, würde es genügen, dass du bspw. mit Hotkeyset eine das Auswählen des Fensters startest, und danach die Funktion mit der Schleife ausgeführt wird. Mit einem weiteren Hotkey könntest du die Funktion wieder verlassen, oder machst dir ein kleines Fenster dazu, oder was auch immer.

    Das ist ganz plump und nicht effizient, sollte doch aber erfüllen, was du möchtest, oder? Natürlich hast du hier keine 100% Sicherheit. Es könnte sein, dass während der 5msec Pause eine Messagebox erscheint und du genau in dem Moment Esc oder Leertaste drückst, in dem sie den Fokus hat. Aber wenn du nicht in Wirklichkeit einen Bot laufen hast, der ständig diese Tasten drückt, hat das doch Lottogewinn-Wahrscheinlichkeit.

    Spoiler anzeigen

    Grüße autoiter