Laden...

Programm verankern

Erstellt von nermin vor 18 Jahren Letzter Beitrag vor 15 Jahren 10.417 Views
N
nermin Themenstarter:in
43 Beiträge seit 2005
vor 18 Jahren
Programm verankern

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

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo nermin,

wie es geht, weiß ich nicht. Aber ich kann dir ein Suchwort sagen: Workingarea.

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

N
nermin Themenstarter:in
43 Beiträge seit 2005
vor 18 Jahren

Ja soweit war ich auch schon.

Aber ich weiß nicht wie man das dann verändert, weils nicht veränderbar ist.

2.921 Beiträge seit 2005
vor 18 Jahren

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.

N
nermin Themenstarter:in
43 Beiträge seit 2005
vor 18 Jahren

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

S
8.746 Beiträge seit 2005
vor 18 Jahren

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.

49.485 Beiträge seit 2005
vor 18 Jahren

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

S
8.746 Beiträge seit 2005
vor 18 Jahren

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.

X
2.051 Beiträge seit 2004
vor 18 Jahren

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.

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo svenson,

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

herbivore

N
nermin Themenstarter:in
43 Beiträge seit 2005
vor 18 Jahren

Geht alles nicht!

Hat sonst wer eine Idee?

nermin

49.485 Beiträge seit 2005
vor 18 Jahren

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

X
2.051 Beiträge seit 2004
vor 18 Jahren

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);
    }
}

D
46 Beiträge seit 2006
vor 17 Jahren

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")! 😁

822 Beiträge seit 2005
vor 17 Jahren

Hallo

Siehe auch hier, der Code funktioniert auch sehr gut:

Problem beim Docken von Form an Bildschirm

sbertl

P
71 Beiträge seit 2006
vor 17 Jahren

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

X
2.051 Beiträge seit 2004
vor 17 Jahren

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

M
255 Beiträge seit 2006
vor 16 Jahren

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(...

M
255 Beiträge seit 2006
vor 16 Jahren

niemand?

N
67 Beiträge seit 2006
vor 16 Jahren

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

Grüße Steffen

D
44 Beiträge seit 2006
vor 15 Jahren

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.

mfg. Daniel 😁