gruenspecht
Goto Top

Infobereich der Taskleiste mittels Batch(CMD) bzw. Powershell aktualisieren

Irgendwie habe ich bei einem Projekt ein kleines Problem:

Zum "harten" Beenden eines externen Programmes habe ich den Task in Powershell mittels

Get-Process meinprogramm| Stop-Process

abgeschossen.

Nun ist das Icon des Processes aber im Infobereich der Taskleiste stehen geblieben. Fahre ich mit der Maus darüber verschwindet es.

Gibt es unter Windows 10 einen DOS- oder Powershell-Befehl, mit dem man einen Referesh des Bildschrirms bzw. speziell des Infobereiches der Taskleiste machen kann?

Hat da jemand eine Idee?

Grüße und schönes Wochenende

Content-Key: 536851

Url: https://administrator.de/contentid/536851

Printed on: April 19, 2024 at 12:04 o'clock

Member: colinardo
Solution colinardo Jan 19, 2020 updated at 11:28:49 (UTC)
Goto Top
Servus @Gruenspecht,
auf die schnelle
function Refresh-NotificationTrayArea(){
    if (!("Tools.Win32" -as [type])){  
        Add-Type -MemberDefinition '  
        [StructLayout(LayoutKind.Sequential)]
        public struct RECT
        {
            public int left;
            public int top;
            public int right;
            public int bottom;
        }
        [DllImport("user32.dll", SetLastError = true)]public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);  
        [DllImport("user32.dll", SetLastError = true)]public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass,string lpszWindow);  
        [DllImport("user32.dll", SetLastError = true)]public static extern IntPtr GetWindow(IntPtr hWnd, int uCmd);  
        [DllImport("user32.dll")] public static extern bool GetClientRect(IntPtr hWnd, out RECT lpRect);  
        [DllImport("user32.dll")] public static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, int lParam);  
        ' -Name Win32 -Namespace Tools  
    }
    $main = [Tools.Win32]::FindWindow("Shell_TrayWnd","")  
    $sub = [Tools.Win32]::FindWindowEx($main,[System.IntPtr]::Zero,"TrayNotifyWnd","")  
    $syspager = [Tools.Win32]::FindWindowEx($sub,[System.IntPtr]::Zero,"SysPager","")  
    $trayarea = [Tools.Win32]::GetWindow($syspager,5)
    [Tools.Win32+RECT]$rect = New-Object Tools.Win32+RECT
    [Tools.Win32]::GetClientRect($trayarea,[ref]$rect) | out-null

    for ($x = 0; $x -lt $rect.right; $x += 5){ 
        for ($y = 0; $y -lt $rect.bottom; $y += 5){ 
            [Tools.Win32]::SendMessage($trayarea,0x0200,0,($y -shl 16) + $x) |out-null
        }   
    }
}

Refresh-NotificationTrayArea
p.s. das hier behandelt das gleiche
https://www.codeproject.com/Articles/19620/LP-TrayIconBuster

Grüße Uwe
Member: rubberman
rubberman Jan 19, 2020 at 11:38:20 (UTC)
Goto Top
Hallo Uwe,

nur aus Interesse ... Ist das Systray ein Shell Window wo ein F5 Einfluss haben könnte/sollte?
$c=Add-Type -Name WinAPI -PassThru -MemberDefinition '[DllImport("user32.dll", SetLastError=true)] public static extern int PostMessageW(IntPtr hWnd, uint Msg, UIntPtr wParam, IntPtr lParam);'  
[void]$c::PostMessageW(
  (New-Object IntPtr(65535)),  # HWND_BROADCAST
  273,                         # WM_COMMAND
  (New-Object UIntPtr(41504)), # accelerator ID of virtual key F5 in Shell windows
  [IntPtr]::Zero               # not used
);
Das HWND_BROADCAST ist natürlich overkill, sollte aber das Systray zumindest auch erreichen. Ich weiß nur nicht wie ich es testen kann. Hab solche komischen Erscheinungen nicht face-wink

Steffen
Member: colinardo
colinardo Jan 19, 2020 updated at 11:50:00 (UTC)
Goto Top
Servus Steffen,
Ist das Systray ein Shell Window wo ein F5 Einfluss haben könnte/sollte?
nein das reagiert nicht darauf. Der verlinkte Code-Project Code zeigt aber wie man die Phantom-Icons alternativ auch entfernen kann, ist aber mit ähnlichem Aufwand verbunden.

Grüße Uwe
Member: Gruenspecht
Gruenspecht Jan 19, 2020 at 17:15:10 (UTC)
Goto Top
Hi Uwe,

vielen vielen Dank! Ich verstehe den Code (aufgrund meiner sehr mageren Programmierkenntnisse) zwar nicht wirklich - aber er funktioniert SUPER!!

Ihr seid KLASSE.

Grüße aus der Werkzeugstadt Remscheid

Klaus
Member: Gruenspecht
Gruenspecht Jan 20, 2020 at 10:23:22 (UTC)
Goto Top
Hallo Leute,

vorweg, ich habe nur ein paar Grundkenntnisse im Programmieren und noch weniger Kenntnisse von Powershell.

Uwe hat mir hier ein tolles Script zur Verfügung gestellt, zu dem ich hinsichtlich der Schreibweise beim Powershell-Code speziell dem Gravisakzent noch eine Frage habe:

In der 3. Zeile steht

Add-Type -MemberDefinition '  

Ich habe mal gelernt, dass mit dem Escapezeichen ein Literal, die Zeilenfortsetzung oder
ein Sonderzeichen angegeben werden kann.

Wenn ich das richtig deute, ist das hier als ein Zeilenfortsetzung genutzt.

Weiter unten im Quelltext steht:

[DllImport("user32.dll")] public static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, int lParam);  
' -Name Win32 -Namespace Tools  

Da begreife ich die Verwendung des Gravisakzent nicht.

Wie kann man den die beiden Codezeilen ggfl. anders schreiben?

Mein Problem:

Das Script läuft direkt unter Powershell vorzüglich. Nutze ich die in der c´t veröffentlichte Batch-Datei (siehe Aufsatz "Batch ruft PowerShell" https://www.heise.de/select/ct/2019/8/1554716230741666) so geht das in die Hose, weil da irgendwie in der ps1-Datei die lesbare Darstellung durch weglassen der Leerzeichen recht unübersichtlich aussieht.

Also, konkrete Frage: Welche Funktion hat das Escapezeichen bei diesem Statement:

' -Name Win32 -Namespace Tools  

und kann man das auch anders schreiben?

Grüße
Klaus
Mitglied: 142232
Solution 142232 Jan 20, 2020 updated at 11:31:04 (UTC)
Goto Top
Zitat von @Gruenspecht:
zu dem ich hinsichtlich der Schreibweise beim Powershell-Code speziell dem Gravisakzent noch eine Frage habe:
Das ist kein Akzent, das ist ein normales Hochkomma das die Einleitung eines ganz normalen Strings einleutet der auch über mehrere Zeilen stehen kann und am Ende wird der einfach in der Zeile
' -Name Win32 -Namespace Tools  
mit dem Hochkomma wieder beendet. Also nichts weltbewegendes und hat garnichts mit irgenwelchem Escaping zu tun denn du bist hier in einem String und nicht außerhalb.

Ich habe mal gelernt, dass mit dem Escapezeichen ein Literal, die Zeilenfortsetzung oder
ein Sonderzeichen angegeben werden kann.
Ist kein Escape-Zeichen sondern Einleitung eines stinknormalen Strings!
Wie kann man den die beiden Codezeilen ggfl. anders schreiben?
Du kannst auch alles in eine Zeile schreiben wenn du willst
Add-Type -MemberDefinition '[StructLayout(LayoutKind.Sequential)]public struct RECT{public int left;public int top;public int right;public int bottom;}[DllImport("user32.dll", SetLastError = true)]public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);[DllImport("user32.dll", SetLastError = true)]public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass,string lpszWindow);[DllImport("user32.dll", SetLastError = true)]public static extern IntPtr GetWindow(IntPtr hWnd, int uCmd);[DllImport("user32.dll")] public static extern bool GetClientRect(IntPtr hWnd, out RECT lpRect);[DllImport("user32.dll")] public static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, int lParam);' -Name Win32 -Namespace Tools  

Escaping in Batch für neue Zeilen übrigens der Backslash, hier nachlesen.
https://www.robvanderwoude.com/escapechars.php

Nutze ich die in der c´t veröffentlichte Batch-Datei (siehe Aufsatz "Batch ruft PowerShell" https://www.heise.de/select/ct/2019/8/1554716230741666)
Für den Artikel soll man blechen ... wie man PS in Batch aufruft gibt's ja Artikel en masse im Web, da geb ich kein Geld für aus.
Member: Gruenspecht
Gruenspecht Jan 20, 2020 at 11:57:10 (UTC)
Goto Top
OK, begriffen! Danke "serial"!!

Grüße aus Remscheid

Klaus


PS: Sorry für den Heise-Link. Da ich die c´t im Abo habe, ist mir gar nicht aufgefallen, dass man sich für die Seite anmelden musste. Bin irgendwie dauernd angemeldet.