Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Programm verankern
nermin
myCSharp.de - Member



Dabei seit:
Beiträge: 43

Themenstarter:

Programm verankern

beantworten | zitieren | melden

Hallo!

Wie mach ich es, dass mein selbst geschriebenes Programm oben im Screen verankert wird? Eigentlich nur mein mainmenuitem oder menustrip.

TopMost hab ich schon, aber wie geht das, dass die anderen Programme nicht mehr bis ganz nach oben gehen, sprich 0,5 cm von oben aufhören?
Ebenso die Desktopelemente nach untenverschoben.

Ich hoffe ihr kennt euch aus was ich meine und hoffe eine Antwort.

Danke nermin
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo nermin,

wie es geht, weiß ich nicht. Aber ich kann dir ein Suchwort sagen: Workingarea.
Zitat
Der Arbeitsbereich (Workingarea) ist der Bereich des Desktops der Anzeige ohne Taskleisten, angedockte Fenster und angedockte Symbolleisten.
Mit Screen.GetWorkingArea bekommst du sie. Wie du sie festlegst weiß ich aber - wie gesagt - nicht.

herbivore
private Nachricht | Beiträge des Benutzers
nermin
myCSharp.de - Member



Dabei seit:
Beiträge: 43

Themenstarter:

beantworten | zitieren | melden

Ja soweit war ich auch schon.

Aber ich weiß nicht wie man das dann verändert, weils nicht veränderbar ist.
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 2.914
Herkunft: Deutschland

beantworten | zitieren | melden

Die kann man im Windows zumindest mit Framework 1.0/1.1 nur über WndProc festlegen oder APIs festlegen. Leider finde ich auch gerade nicht mehr heraus, welche das sind, bzw. waren. Vielleicht gibt's ja im 2.0er-Framework entsprechende Funktionen
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers
nermin
myCSharp.de - Member



Dabei seit:
Beiträge: 43

Themenstarter:

beantworten | zitieren | melden

Nein leider nicht!

Aber es muss doch irgendwie gehen. Kann ich mein Programm den als Symbolleiste oder so definieren. Oder wie greife ich den direkt auf Windows zu?

nermin
private Nachricht | Beiträge des Benutzers
svenson
myCSharp.de - Member



Dabei seit:
Beiträge: 8.746
Herkunft: Berlin

beantworten | zitieren | melden

Das "Verankern" eines Programm ist leicht. Dazu fängst du nur das Event ab, der die Positionsänderung mitteilst und setzt die Position wieder zurück. Allerdings wird so das Verschieben nicht völlig verhindert, das Fenster springt nur wieder zurück.

Ich weiss allerdings nicht, wie man verhindern soll, dass andere Programme dieses Fenster überdecken. Geht meines Wissen gar nicht. Bestenfalls kann du dich in die Windows-Message-Loop hängen und alle Positionsveränderungen abfangen und durch ein Feuern einer entsprechenden Botschaft rückgängig machen oder verändern.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo svenson,

nee, dass muss schon irgendwie gehen. Ich kenne Programme, die das tun und dann verschiebt sich richtig der Desktop um deren Fenstebreite/-höhe. Aber wie es geht weiß ich leider auch nicht.

Hallo nermin,

mit dem Stichwort Workingarea bist auch nirgends fündig geworden?

herbivore
private Nachricht | Beiträge des Benutzers
svenson
myCSharp.de - Member



Dabei seit:
Beiträge: 8.746
Herkunft: Berlin

beantworten | zitieren | melden

Schräg, hab ich ja noch nie gesehen. Haste mal ein Beispiel zum Angucken?

Wäre es denkbar, dass die sich einfach so eine zusätzliche Leiste anlegen und sich da reinfummeln? Vielleicht gehts auch über die Shell-API.
private Nachricht | Beiträge des Benutzers
Xqgene
myCSharp.de - Member



Dabei seit:
Beiträge: 2.051

beantworten | zitieren | melden

es gibt unter Windows so genannte ShellAPI. damit kann man die ApplicationBars (so wie die Windows Taskleiste) erstellen. so eine AppBar ist genau das, wonach du suchst. die wird oben/unten/.. am Bildschirm angedockt und andere Fenster können diesen bereich nicht mehr in Anspruch nehmen. Desktop wird also um AppBar-Bereich kleiner.

Erstellen kann man so eine Bar ziemlich einfach. Das fndest du schnell in der ShellAPI Doku heraus.
"A programmer is a tool which converts coffein to code."

Evely ToDo-Manager 1.2 (Build 1.2.585)
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo svenson,

der T-DSL-SpeedManager macht das glaube ich so. Kann man irgendwo bei t-com.de runterladen.

herbivore
private Nachricht | Beiträge des Benutzers
nermin
myCSharp.de - Member



Dabei seit:
Beiträge: 43

Themenstarter:

beantworten | zitieren | melden

Geht alles nicht!

Hat sonst wer eine Idee?

nermin
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo nermin,

ich habe Xqgene Beitrag so verstanden, dass das ShellAPI *der* Weg ist, also wohl auch der einzige. Es sollte also gehen (auch wenn ich nicht weiß wie). Wenn du es nicht hinbekommen hast, schreib mal, was du versuchst hast und was warum (Fehlermeldung/Effekt) nicht funktioniert hat.

herbivore
private Nachricht | Beiträge des Benutzers
Xqgene
myCSharp.de - Member



Dabei seit:
Beiträge: 2.051

beantworten | zitieren | melden

habe endlich Zeit gefunden wieder hier reinzugucken.

also die aussage "es geht nicht" finde ich einfach peinlich. man sollte zumindest zeigen, wie man versucht hat, das Problem zu lösen.

und wenn man schon Hinweise zur Lösung bekommt, sollte man diese auch angehen. Speziell zu AppBar gibt es im Internet tausende Beispiele.

Bsp. unten (noch eins ) reserviert 100 Px Desktop Platz (oben) und positioniert das aktuelle Form in diesem Bereich:

 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace WindowsApplication1
{

    [StructLayout(LayoutKind.Sequential)]
    public struct APPBARDATA
    {
        public uint cbSize;
        public IntPtr hWnd;
        public uint uCallbackMessage;
        public uint uEdge;
        public RECT rc;
        public int lParam;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct RECT
    {
        public int left;
        public int top;
        public int right;
        public int bottom;
    }
    public partial class Form1 : Form
    {
        const int ABM_NEW         = 0x00000000;
        const int ABM_REMOVE      = 0x00000001;
        const int ABM_SETPOS      = 0x00000003;
        const int ABM_QUERYPOS    = 0x00000002;

        const int ABE_TOP = 1;

        public Form1()
        {
            InitializeComponent();
            FormBorderStyle = FormBorderStyle.SizableToolWindow;
        }
        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            APPBARDATA abd = new APPBARDATA();
            abd.cbSize = (uint)Marshal.SizeOf(typeof(APPBARDATA));
            abd.hWnd = this.Handle;
            abd.uCallbackMessage = RegisterWindowMessage(Guid.NewGuid().ToString()); ;

            SHAppBarMessage(ABM_NEW, ref abd);

            abd.rc = new RECT();
            abd.uEdge = ABE_TOP;
            abd.rc.top = 0;
            abd.rc.left = 0;
            abd.rc.bottom = 100;
            abd.rc.right = SystemInformation.PrimaryMonitorSize.Width;
            SHAppBarMessage(ABM_QUERYPOS, ref abd);
            SHAppBarMessage(ABM_SETPOS, ref abd);
            Location = new Point(abd.rc.left, abd.rc.top);
            Size = new Size(abd.rc.right, abd.rc.bottom);
        }

        protected override void OnClosed(EventArgs e)
        {
            APPBARDATA abd = new APPBARDATA();
            abd.cbSize = (uint)Marshal.SizeOf(typeof(APPBARDATA));
            abd.hWnd = this.Handle;

            SHAppBarMessage(ABM_REMOVE, ref abd);
            
            base.OnClosed(e);
        }
        [DllImport("shell32.dll")]
        static extern IntPtr SHAppBarMessage(uint dwMessage,
           ref APPBARDATA pData);
        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        static extern uint RegisterWindowMessage(string lpString);
    }
}
"A programmer is a tool which converts coffein to code."

Evely ToDo-Manager 1.2 (Build 1.2.585)
private Nachricht | Beiträge des Benutzers
davechu
myCSharp.de - Member



Dabei seit:
Beiträge: 46

beantworten | zitieren | melden

der code funktioniert super. damit kann man wirklich einiges basteln.

und damit keiner so lang wie ich nach diesem fehler suchen muss: beim copy&paste nicht vergessen, den namespace abzuändern (also z. b. "namespace MeinTestprogramm")!
private Nachricht | Beiträge des Benutzers
sbertl000
myCSharp.de - Member

Avatar #avatar-2350.png


Dabei seit:
Beiträge: 822
Herkunft: Wien

beantworten | zitieren | melden

Hallo

Siehe auch hier, der Code funktioniert auch sehr gut:

Problem beim Docken von Form an Bildschirm


sbertl
private Nachricht | Beiträge des Benutzers
Primusio
myCSharp.de - Member



Dabei seit:
Beiträge: 71

beantworten | zitieren | melden

Hallöle Community,
ich hätte da einmal eine Frage zu dem Code von Xqgene.

Der Code funktioniert wunderbar, allerdings möchte ich meine Anwendung nicht in einem SizableToolWindow Rahmen haben, sondern ganz ohne aber wenn ich


        public Form1()
        {
            InitializeComponent();
            FormBorderStyle = FormBorderStyle.SizableToolWindow;
        }

durch


        public Form1()
        {
            InitializeComponent();
            FormBorderStyle = FormBorderStyle.None;
        }

ersetze bringt er mir nicht das gewünschte Ergebnis, er reserviert zwar den Platz aber packt die Anwendung nicht hinein, leider sehe ich nicht wirklich, was das mit dem borderStyle zu tun hat.

Wäre für eine kleine Hilfestellung oder Lösung sehr dankbar.

MfG
Primusio
private Nachricht | Beiträge des Benutzers
Xqgene
myCSharp.de - Member



Dabei seit:
Beiträge: 2.051

beantworten | zitieren | melden

das mit "ohne Border" stimmt leider. muss wohl ein Fehler in .NET Wrappern geben.
.NET bekommt irgendwie nicht ganz mit, dass das Fenster kein Border mehr hat und platziert das Fenster mit Berücksichtigung nicht existierender Fenstertitelleiste.

mit dem Fehler hatte ich auch beim Erstellen meiner SmallToolBar zu kämpfen.

Workaround zur Behebung des Fehlers wäre also die Position des Fenster noch ein mal zu setzen, zu einem etwas späteren Zeitpunkt. Man muss bloß das richtige Ereignis erwischen, wo es auch funktioniert.

es gibt aus eine erweiterte Option, die z.B. auch berücksichtigt, wenn eine andere App für sich Platz am Rand beansprucht. Das ist aber etwas zu viel für diesen Thread. Da kannst du einfach die oben genannte Toolbar runterladen und z.B. mit Reflector sich anschauen

Xqgene
"A programmer is a tool which converts coffein to code."

Evely ToDo-Manager 1.2 (Build 1.2.585)
private Nachricht | Beiträge des Benutzers
Mazo
myCSharp.de - Member



Dabei seit:
Beiträge: 255
Herkunft: Sachsen

beantworten | zitieren | melden

irgendwie bin ich zu blöd
kann mir mal jemand sagen, wie ich den Code ändern muss damit ich den reservierten Platz unten habe? Ich hab das jetzt mehrfach probiert und es nur geschaft das mein ganezr Bildschirm reserviert war X(...
private Nachricht | Beiträge des Benutzers
Mazo
myCSharp.de - Member



Dabei seit:
Beiträge: 255
Herkunft: Sachsen

beantworten | zitieren | melden

niemand?
private Nachricht | Beiträge des Benutzers
Niwrex
myCSharp.de - Member



Dabei seit:
Beiträge: 67
Herkunft: Heßles

beantworten | zitieren | melden

Hi,
ist eine Sehr gute Hilfe zum einstieg in diese Thematik, wahrscheinlich die Beste die man so finden kann...

Grüße Steffen
private Nachricht | Beiträge des Benutzers
daos06
myCSharp.de - Member



Dabei seit:
Beiträge: 44
Herkunft: Tirol (Österreich)

beantworten | zitieren | melden

Zitat von Mazo
irgendwie bin ich zu blöd
kann mir mal jemand sagen, wie ich den Code ändern muss damit ich den reservierten Platz unten habe? Ich hab das jetzt mehrfach probiert und es nur geschaft das mein ganezr Bildschirm reserviert war X(...

Bei mir gehts auch nicht :-(
Ich hätte es gerne auf meinem 2ten Bildschirm unten...

Es erscheint zwar das Form am richtigen Platz, aber es wird kein Bereich reserviert...

Ich hab nur diesen Bereich verändert:


            abd.rc.top = Screen.AllScreens[1].Bounds.Bottom - 40;
            abd.rc.left = Screen.AllScreens[1].Bounds.Left;
            abd.rc.bottom = Screen.AllScreens[1].Bounds.Bottom;
            abd.rc.right = Screen.AllScreens[1].Bounds.Width;

edit: Hat sich erledigt! Ich hab ABE_TOP vergessen auf 3 zu setzen.
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von daos06 am .
mfg. Daniel
private Nachricht | Beiträge des Benutzers