Laden...

NotifyIcon verschieben, ganz nach rechts

Erstellt von Levitas vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.046 Views
L
Levitas Themenstarter:in
95 Beiträge seit 2009
vor 13 Jahren
NotifyIcon verschieben, ganz nach rechts

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

1.044 Beiträge seit 2008
vor 13 Jahren

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

L
Levitas Themenstarter:in
95 Beiträge seit 2009
vor 13 Jahren

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

L
Levitas Themenstarter:in
95 Beiträge seit 2009
vor 13 Jahren

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

49.485 Beiträge seit 2005
vor 13 Jahren

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

L
Levitas Themenstarter:in
95 Beiträge seit 2009
vor 13 Jahren

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

P
660 Beiträge seit 2008
vor 13 Jahren

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

MfG
ProGamer*Der Sinn Des Lebens Ist Es, Den Sinn Des Lebens Zu Finden! *"Wenn Unrecht zu Recht wird dann wird Widerstand zur Pflicht." *"Ignorance simplifies ANY problem." *"Stoppt die Piraterie der Musikindustrie"

L
Levitas Themenstarter:in
95 Beiträge seit 2009
vor 13 Jahren

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

P
660 Beiträge seit 2008
vor 13 Jahren

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*Der Sinn Des Lebens Ist Es, Den Sinn Des Lebens Zu Finden! *"Wenn Unrecht zu Recht wird dann wird Widerstand zur Pflicht." *"Ignorance simplifies ANY problem." *"Stoppt die Piraterie der Musikindustrie"

L
Levitas Themenstarter:in
95 Beiträge seit 2009
vor 13 Jahren

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

4.938 Beiträge seit 2008
vor 13 Jahren

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.

L
Levitas Themenstarter:in
95 Beiträge seit 2009
vor 13 Jahren

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