Laden...

Wie Systray komplett aktualisieren lassen?

Erstellt von AtzeX vor 16 Jahren Letzter Beitrag vor 13 Jahren 3.930 Views
A
AtzeX Themenstarter:in
217 Beiträge seit 2006
vor 16 Jahren
Wie Systray komplett aktualisieren lassen?

Hallo.

Ich muss leider manchmal hängende Prozesse externer Programme abschießen.
Da eines dieser Programme leider ein SysTray Icon hat, bleibt dieses bestehen und geht erst weg, wenn ich mit der Maus darüber fahre.

Gibt es eine Möglichkeit, das Systray auch ohne Maus zu refreshen um diese verwaisten Icons zu entfernen?

Danke im Vorraus,

AtzeX

1.373 Beiträge seit 2004
vor 16 Jahren

Hallo,

Meines (natürlich begrenzten 😉 ) Wissens nach, gibt es hier für keinen API-Befehl. Die einzige Möglichkeit, den Systray-Bereich zu refreshen ist mit der Maus darüber zu fahren. Das wiederum kann man natürlich auch mit Quellcode simulieren.

Grüße,
Andre

A
AtzeX Themenstarter:in
217 Beiträge seit 2006
vor 16 Jahren

Schade.
Eine wirklich funktionierende Simulation dessen stelle ich mir doch recht komplex vor, da man sicherlich auch die Höhe des Systrays (kann doch mehrzeilige sein, oder?) berücksichtigen muss und die Maus wohl auch nicht zu schnell darüber 'bewegen' darf, oder?

H
240 Beiträge seit 2006
vor 16 Jahren

mhh... mal nen Schuss ins Blaue: Kann man vielleicht, die Taskleiste aus- und wieder einblenden? Dann müsste die sich doch auch aktualisieren, oder nicht?

MfG hulkstar

2.921 Beiträge seit 2005
vor 16 Jahren

Sieh Dir mal dazu bitte

Windows Uhr ersetzen

an. Damit kannst Du das Fenster ermitteln, wenn es ein anderer Bereich von der TaskLeiste sein soll, dessen Class-Name mit Spy++ ermitteln.

Dann ähnlich wie in

Direkt auf Desktop zeichnen mit GDI+

InvalidateRect aufrufen, um ein neuzeichnen zu erzwingen. Vielleicht reicht das schon, oder bringt Dich zumindest in die richtige Richtung.

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

630 Beiträge seit 2007
vor 16 Jahren

Hier ein Link zu einem längeren (lustigen) Heise-Thread zu dem Thema. Scheint doch nicht ganz so einfach zu sein...

Icons aus Tray enfernen

To understand recursion you must first understand recursion

http://www.ilja-neumann.com
C# Gruppe bei last.fm

A
AtzeX Themenstarter:in
217 Beiträge seit 2006
vor 14 Jahren

Ist jemandem bekannt, ob es da evtl. mittlerweile eine vom Betriebssystem bereitgestellte Lösung für gibt?

1.044 Beiträge seit 2008
vor 14 Jahren

Hallo AtzeX,

ein einfaches Senden mit der SendMessage-Funktion und der Konstante WM_PAINT sollte in der Regel genügen. Mit der Simulation der Maus ist total unnötig. Warum soll man es sich schwer machen, wenn es auch einfacher geht?

zero_x

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo zero_x,

nein, Paint reicht nicht. Kannst du ausprobieren, wenn du so ein verweistes Icon erzeugst und dann die Taskleiste verschiebst. Obwohl sie dann ja neu gezeichnet wird, verschwindet das Icon nicht.

Hallo AtzeX,

nein, meines Wissens nicht.

herbivore

1.044 Beiträge seit 2008
vor 14 Jahren

Hallo herbivore,

stimmt, du hast recht. 8o

Hallo AtzeX,

du kannst mit der TBBUTTON-Sturktur arbeiten und herausfinden welchen Handle das Icon zugewiesen ist. Wenn das Fenster zertört wird, aber das Icon jedoch vorhanden ist, muss der Handle(= NULL) ungültig sein. Hier habe ich ein Beispiel in Delphi gefunden: Taskleiste aktualisieren .

zero_x

A
AtzeX Themenstarter:in
217 Beiträge seit 2006
vor 14 Jahren

@herbivore:
Danke dir.

@zero_x:
Danke dir besonders, aber bis ich das auf C# umgebaut habe, ist Weihnachten. 😉

L
416 Beiträge seit 2008
vor 14 Jahren

Alles andere als schön aber funktioniert (zumindest bei meinen Tests):


Point oldPos = Cursor.Position;
int maxY = Screen.AllScreens[0].WorkingArea.Height;
Cursor.Position = new Point(Screen.AllScreens[0].WorkingArea.Right, maxY + 15);
for (int i = Cursor.Position.X; i > Cursor.Position.X / 2; i -= 2)
{
     Cursor.Position = new Point(i, maxY + 15);
}
Cursor.Position = oldPos;

evtl. an folgendem drehen:
maxY + 15, i -= 2, i > Cursor.Position.X / 2

A
AtzeX Themenstarter:in
217 Beiträge seit 2006
vor 14 Jahren

@Lennart:
Funktioniert bei mir leider gar nicht.

Edit:
Funktioniert doch, aber nicht immer.

Edit2:
Funktioniert nur, wenn ich über Cursor.Position = new Point(i, maxY + 15); ein System.Threading.Thread.Sleep(1); einbaue.

Allerdings ist das Ganze recht 'weak'.

Gruß,
Axel

1.044 Beiträge seit 2008
vor 14 Jahren

Hallo AtzeX,

mit der GetClientRect-Funktion lässt sich die Höhe als auch die Breite des Trays ermitteln. Damit kann man ganz einfach die Maus über die Icons fahren lassen.

zero_x

A
AtzeX Themenstarter:in
217 Beiträge seit 2006
vor 14 Jahren

@zero_x, Lennart:
Danke nochmal, aber ich habe gerade zufällig festgestellt, dass das (natürlich) nicht funktioniert, wenn die Taskleiste automatisch ausgeblendet wird.
Dann ist sie nicht sichtbar und der Maustrick funktioniert nicht.

Ist aber nicht so schlimm.
Das Problem ist kein großes, es wäre nur schön gewesen, wenn mittlerweile eine einfache verlässliche Lösung existiert hätte.

2.921 Beiträge seit 2005
vor 14 Jahren

Auf dieser Seite, steht ziemlich weit unten eine Lösung:

Send Signal to Explorer to refresh systray...

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

A
AtzeX Themenstarter:in
217 Beiträge seit 2006
vor 14 Jahren

@dr4g0n76:
Wenn ich dich richtig verstehe, meinst du diesen Code, richtig?

#define FW(x,y) FindWindowEx(x, NULL, y, L"")
void RefreshTaskbarNotificationArea(){
    HWND hNotificationArea;
    RECT r;
    GetClientRect(
        hNotificationArea = FindWindowEx(
            FW(FW(FW(NULL, L"Shell_TrayWnd"), L"TrayNotifyWnd"), L"SysPager"),
            NULL,
            L"ToolbarWindow32",
            L"Notification Area"),
        &r);
    for (LONG x = 0; x < r.right; x += 5)
        for (LONG y = 0; y < r.bottom; y += 5)
            SendMessage(
                hNotificationArea,
                WM_MOUSEMOVE,
                0,
                (y << 16) + x);
}

Bevor ich versuche den auf C# umzubauen:
Wenn ich richtig sehe, simuliert der aber auch die Maus, oder etwa nicht?

Gruß,
AtzeX

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo AtzeX,

ja, offensichtlich. 😃

herbivore

A
AtzeX Themenstarter:in
217 Beiträge seit 2006
vor 13 Jahren

Hallo zusammen,

da ja wieder über ein Jahr ins Land gegangen ist und mich das Thema hin und wieder doch noch nervt, erlaube ich mir, einmal nachzufragen, ob es da mittlerweile neue Möglichkeiten gibt?

Vielleicht eine kleine aber feine API, die mir noch unbekannt ist? 😃

Gruß,
AtzeX