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
NotifyIcon verschieben, ganz nach rechts
Levitas
myCSharp.de - Member



Dabei seit:
Beiträge: 96

Themenstarter:

NotifyIcon verschieben, ganz nach rechts

beantworten | zitieren | melden

Hallo Leute!

Ich suche derzeit nach einem Weg, ein NotifyIcon "ganz nach rechts" zu verschieben.
Es soll die Windows-Batterieanzeige ersetzen, da ich die (in XP) einfach nur zum kotzen finde. Das Programm kann hier angesehen/runtergeladen werden. (Einfach die exe starten, man kann es dann mit der rechten Maustaste beenden).

Es funktioniert schon alles, jedoch ist es an der falschen Position. Das Ausblenden des Originals kann man per Hand vornehmen. Nun muss nur noch meines richtig angezeigt werden, und nicht irgendwo.

Mir ist klar, dass das nur (wenn überhaupt) über die Windows-API funktioniert.
Hat jemand von euch vllt. eine Idee, wie das funktionieren könnte?

Lg Marc
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Levitas am .
private Nachricht | Beiträge des Benutzers
zero_x
myCSharp.de - Member

Avatar #avatar-2567.gif


Dabei seit:
Beiträge: 1069
Herkunft: Koblenz

beantworten | zitieren | melden

Hallo Levitas,

mit der TBBUTTON-Struktur ist es möglich. Aber ohne Weiteres geht das nicht. Du musst Speicher allokieren und dort schreiben. Such am besten mal mit dem Stichwort "TBBUTTON NotifyIcon". Du wirst bestimmt was finden.

zero_x
zero_x | myCSharp.de - gemeinsam mehr erreichen

Für längere Zeit inaktiv.
private Nachricht | Beiträge des Benutzers
Levitas
myCSharp.de - Member



Dabei seit:
Beiträge: 96

Themenstarter:

beantworten | zitieren | melden

Hallo,

vielen Dank erstmal für deinen Tipp zero_x, ich bin schon eifrig am suchen, das meiste was ich bisher jedoch gefunden habe hatte nur mit dem bekommen der Werte, und nicht mit dem setzen der Werte zu tun...

Ich melde mich nochmal wenn ich mehr weiß,

Lg Marc
private Nachricht | Beiträge des Benutzers
Levitas
myCSharp.de - Member



Dabei seit:
Beiträge: 96

Themenstarter:

beantworten | zitieren | melden

Ok, ich habe mich jetzt 2 Tage lang gespielt.. Aber ich bring es einfach nicht zusammen. Kann mir vllt. jemand auf die Sprünge helfen?

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

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

Hallo Levitas,

wie sieht dein Code aus? Was genau ist das Problem? Ich meine im Sinne von [Hinweis] Wie poste ich richtig? Punkt 5.

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



Dabei seit:
Beiträge: 96

Themenstarter:

beantworten | zitieren | melden

Hallo,

das ist ja das Problem... Ich finde keinen Code dazu, wie man sowas bewerkstelligen könnte. Ich habe einfach keine Ahnung, deswegen habe ich nochmal gefragt... Und da ich keinen Code habe, weiß ich auch nicht was ich davon zeigen könnte ;)

Lg Marc
private Nachricht | Beiträge des Benutzers
ProGamer
myCSharp.de - Member



Dabei seit:
Beiträge: 691
Herkunft: NRW

beantworten | zitieren | melden

mal ne ganz stupide frage, aber willst du dass deine anwendung im Sys-Tray sichtbar ist oder in der taskbar?

falls zweistes gucke mal hier: Textfeld in die Windows TaskBar einfügen.

EDIT:
vllt auch etwas für dich: Battery Monitor
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von ProGamer am .
MfG
ProGamer
private Nachricht | Beiträge des Benutzers
Levitas
myCSharp.de - Member



Dabei seit:
Beiträge: 96

Themenstarter:

beantworten | zitieren | melden

Das Programm ist eine systray-App. Es zeigt einfach nur den Akku-Status an, jedoch viel detaillierter als Windows (und braucht gerade mal 9MB im Ram und hat max. 10 Sekunden Reaktionszeit).

Da normalerweise die Batterie-Anzeige in Windows als erstes geladen wird, ist sie im System-Tray auch ganz rechts. Mein Symbol kullert allerdings immer irgendwo herum, deswegen möchte ich es beim AppStart ganz nach rechts, also an die erste Position verschieben, damit es auch sichtbar ist. Ich habe allerdings keine Idee, wie ich das machen soll.
Ich hoffe dass ihr mir jetzt helfen könnt, bitte entschuldigt dass ich bisher etwas "schwammig" gefragt habe... :)

Lg Marc
private Nachricht | Beiträge des Benutzers
ProGamer
myCSharp.de - Member



Dabei seit:
Beiträge: 691
Herkunft: NRW

beantworten | zitieren | melden

ich glaube (weiss es aber nicht) das hat was damit zu tun wie die Dienste geladen werden.

Du müsstest es schaffen dass dein Dienst zuerst geladen wird.
MfG
ProGamer
private Nachricht | Beiträge des Benutzers
Levitas
myCSharp.de - Member



Dabei seit:
Beiträge: 96

Themenstarter:

beantworten | zitieren | melden

Ja, das ist mir ja auch klar. Ich weiß aber nicht wie, vor allem nicht, weil das Programm kein Windows-Dienst ist, sondern einfach ein als [STAThread] markiertes Programm, das statt normaler GUI einfach nur ein NotifyIcon lädt. Es sollte möglichst einfach sein, deshalb habe ich es so gemacht, dass man die runtergeladene exe einfach nur in den Autostart kopieren muss damit es funktioniert...

Aber es ist auf jeden Fall möglich, die Symbole nachträglich noch zu verschieben. Es gibt einige Programme die das ermöglichen, darunter z.B. "Taskbar shuffle". Ich habe mich schon per Mail an den Programmierer gewandt, jedoch hat er nicht geantwortet, und ich wüsste nicht, wen ich sonst fragen sollte, außer eine Riesen-Community :)

Vllt. weiß ja wirklich jemand wie man sowas machen kann... :)

Lg Marc

Edit: Bitte entschuldigt wenn ich die nächsten drei Tage nicht antworte, da ich nicht zu Hause bin. Mal sehen ob ich ins Internet komme...
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Levitas am .
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4140

beantworten | zitieren | melden

Hallo Levitas,

die Suche nach "tray arrange source code" hat mich direkt zu ShellTrayInfo geführt, einer C++ Anwendung inkl. Source-Code und Beschreibung. Du müßtest dann nur noch die entsprechenden WinAPI-Aufrufe mittels P/Invoke www.pinvoke.net in C# einbinden.
private Nachricht | Beiträge des Benutzers
Levitas
myCSharp.de - Member



Dabei seit:
Beiträge: 96

Themenstarter:

beantworten | zitieren | melden

Danke, das hat mir wirklich sehr geholfen!

Ich habe es nun soweit gebracht, dass das icon ganz links (und da befindet es sich auch direkt nachdem es gestartet wurde...) ganz nach rechts zu verschieben.

Code dazu:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace PowerMonitor
{
    public class Win32
    {
        public enum ToolbarMessages : uint
        {
            WM_USER = 0x0400,
            TB_GETBUTTON = (WM_USER + 23),
            TB_BUTTONCOUNT = (WM_USER + 24),
            TB_MOVEBUTTON = (WM_USER + 82)
        }

        [DllImport("user32.dll", SetLastError = true)]
        static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, int wParam, int lParam);
        
        // For Windows Mobile, replace user32.dll with coredll.dll
        [DllImport("user32.dll", SetLastError = true)]
        static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
        
        [DllImport("user32.dll", SetLastError = true)]
        static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, IntPtr windowTitle);

        private static IntPtr FindTrayToolbarWindow()
        {
            IntPtr hWnd = FindWindow("Shell_TrayWnd", null);
            if (hWnd != IntPtr.Zero)
            {
                hWnd = FindWindowEx(hWnd, IntPtr.Zero, "TrayNotifyWnd", IntPtr.Zero);
                if (hWnd != IntPtr.Zero)
                {
                    hWnd = FindWindowEx(hWnd, IntPtr.Zero, "SysPager", IntPtr.Zero);
                    if (hWnd != IntPtr.Zero)
                    {
                        hWnd = FindWindowEx(hWnd, IntPtr.Zero, "ToolbarWindow32", IntPtr.Zero);
                    }
                }
            }
            return hWnd;
        }

        public static void MoveFirst()
        {
            IntPtr hWnd = FindTrayToolbarWindow();
            int index = 0;
            UInt32 count = (UInt32)SendMessage(hWnd, (uint)ToolbarMessages.TB_BUTTONCOUNT, 0, 0);


            SendMessage(hWnd, (uint)ToolbarMessages.TB_MOVEBUTTON, index, (int)count);
        }
    }
}

Vllt. hilft es ja jemanden :)

Vielen Dank nochmal für die Hilfe,
Lg Marc
private Nachricht | Beiträge des Benutzers