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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 536851
Url: https://administrator.de/contentid/536851
Ausgedruckt am: 26.11.2024 um 01:11 Uhr
7 Kommentare
Neuester Kommentar
Servus @Gruenspecht,
auf die schnelle
p.s. das hier behandelt das gleiche
https://www.codeproject.com/Articles/19620/LP-TrayIconBuster
Grüße Uwe
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
https://www.codeproject.com/Articles/19620/LP-TrayIconBuster
Grüße Uwe
Hallo Uwe,
nur aus Interesse ... Ist das Systray ein Shell Window wo ein F5 Einfluss haben könnte/sollte?
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
Steffen
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
);
Steffen
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 Zeilezu dem ich hinsichtlich der Schreibweise beim Powershell-Code speziell dem Gravisakzent noch eine Frage habe:
' -Name Win32 -Namespace Tools
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!ein Sonderzeichen angegeben werden kann.
Wie kann man den die beiden Codezeilen ggfl. anders schreiben?
Du kannst auch alles in eine Zeile schreiben wenn du willstAdd-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.