Fenster zwingen den Fokus zu haben



  • Hallo,

    mit der Eigenschaft BorderStyle und fsStayonTop kann ich eine Anwendung zwar immer im Vordergrund anzeigen lassen, jedoh hat Sie dann nicht den Fokus. Gibt es eine Möglichkeit, so dass ein Fenster immer im Vordergrund ist und auch immer den Fokus hat, auch wenn man dann woanders hinklickt?

    jens



  • ganz einfach fsStayonTop und dann wsMaximized 😃



  • Hallo,

    mit fsStayOnTop ist das Formular zwar im Vordergrund, aber es hat nicht permament den Fokus. Und was soll ich mit wsMaximized. Ich will kein großes Fenster, das ist schwachsinn!!!

    Meine Idee wäre anhand Ereignisse, die eintreten, wenn das Fenster den Fokus verliert, einfach den Fokus wieder herstellen.

    Frage mich ob dies möglich ist, oder ob es was besseres gibt?

    jens



  • SetForegroundWindow(????) oder
    SetActiveWindow(???)

    koennte in nem Timer erzwungen werden (oder bei Ereignis ?)



  • hallo,

    ich glaube nicht das das ohne weiteres möglich ist. es gibt das zwar eine botschaft namens WM_KILLFOCUS anhand der du feststellen kannst, wann ein fenster seinen focus verliert, aber wenn du es dann mit SetForegroundWindow oder ähnlichem aktivieren willst, wird es nur manchmal in den vordergrund geholt, oft blinkt nur in der Taskleiste das fenstersymbol (flashwindow). so war es jedenfalls bei mir. eigentlich ist ja nix unmöglich, aber ich denke da wirst du ein bißchen beschäftigt sein...

    mfg
    m



  • mit

    SetForegroundWindow(Handle);
    BringWindowToTop(Handle);

    klappt das bei mir.

    Nur System- Fenster draengeln sich noch vor (die mach ich dann bei Bedarf zu, basta!)
    Betrifft z.B. Windows- Taskman.



  • hallo,

    ok, dann hätten wir ja ne lösung, aber ob das ganz befriedigend ist weiß ich auch nicht, und immer funktionierts auch nicht...

    class TForm1 : public TForm
    {
    __published:    // Von der IDE verwaltete Komponenten
    private:    // Anwender-Deklarationen
    public:     // Anwender-Deklarationen
        __fastcall TForm1(TComponent* Owner);
        void __fastcall OnKillFocus(TMessage& Msg);
    protected:
        BEGIN_MESSAGE_MAP
            VCL_MESSAGE_HANDLER(WM_KILLFOCUS, TMessage, OnKillFocus)
        END_MESSAGE_MAP(TForm)
    };
    
    void __fastcall TForm1::OnKillFocus(TMessage& Msg)
    {
        Sleep(500);
        SetForegroundWindow(Handle);
        BringWindowToTop(Handle);
    }
    

    aber ohne das Sleep(...) habe ich wieder nur das FlashWindow-Syndrom, also einen blinkenden Task. die sleep-time ist ausserdem auch noch vom prozessor abhängig, wie gesagt, richtig zufriedenstellend ists nicht...

    mfg
    m



  • Hallo,

    ich habe den Code mal probiert. Beim kompilieren bekomme ich folgende Warnung:

    W8027 Funktionen, die switch enthalten, werden nicht als Inline expandiert.

    Wenn ich die Meldung doppelt anklicke springt er immer in die Zeile, wo das

    BEGIN_MESSAGE_MAP

    steht.

    Liegt das vielleicht daran, dass bei mir alles in einer DLL abläuft oder hat es einen anderen Grund.

    Jens


Anmelden zum Antworten