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
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
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?
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
Sieh Dir mal dazu bitte
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.
Hier ein Link zu einem längeren (lustigen) Heise-Thread zu dem Thema. Scheint doch nicht ganz so einfach zu sein...
Ist jemandem bekannt, ob es da evtl. mittlerweile eine vom Betriebssystem bereitgestellte Lösung für gibt?
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
zero_x | <span style="font-size: 10;">my</span><span style="font-size: 10;">CSharp</span><span style="font-size: 10;">.de</span> - gemeinsam mehr erreichen
Für längere Zeit inaktiv.
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
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
zero_x | <span style="font-size: 10;">my</span><span style="font-size: 10;">CSharp</span><span style="font-size: 10;">.de</span> - gemeinsam mehr erreichen
Für längere Zeit inaktiv.
@herbivore:
Danke dir.
@zero_x:
Danke dir besonders, aber bis ich das auf C# umgebaut habe, ist Weihnachten. 😉
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
@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
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
zero_x | <span style="font-size: 10;">my</span><span style="font-size: 10;">CSharp</span><span style="font-size: 10;">.de</span> - gemeinsam mehr erreichen
Für längere Zeit inaktiv.
@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.
Auf dieser Seite, steht ziemlich weit unten eine Lösung:
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
@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
Hallo AtzeX,
ja, offensichtlich. 😃
herbivore
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