2014-02-26 55 views
1

我使用this post over at Microsoft's TechNet中的代碼更改我正在運行的PowerShell應用程序的圖標。這適用於Powershell窗口中顯示的圖標,但它不會更改任務欄的圖標。我稍微改了一下功能,希望它能改變任務欄中顯示的圖標。運行控制檯應用程序的Powershell更改任務欄圖標

# Set the icon of the current console window to the specified icon. 
# 
# AUTHOR: Aaron Lerch <http://www.aaronlerch.com/blog> 
# COPYRIGHT: © 2009 Aaron Lerch 
# LINK:  http://gallery.technet.microsoft.com/scriptcenter/9d476461-899f-4c98-9d63-03b99596c2c3 
# 
# PARAM: 
# -IconFile 
#  Absolute path to the icon file. 
# RETURN: 
# $null 
function Set-ConsoleIcon { 
    Param(
    [parameter(Mandatory = $true)] [string] $IconFile 
) 

    [System.Reflection.Assembly]::LoadWithPartialName('System.Drawing') | Out-Null 

    # Verify the file exists 
    if ([System.IO.File]::Exists($iconFile) -eq $true) { 
    $ch = Invoke-Win32 'kernel32' ([IntPtr]) 'GetConsoleWindow' 
    $i = 0; 
    $size = 16; 
    while ($i -ne 4) { 
     $ico = New-Object System.Drawing.Icon($iconFile, $size, $size) 
     if ($ico -ne $null) { 
     Send-Message $ch 0x80 $i $ico.Handle | Out-Null 
     } 
     if ($i -eq 4) { 
     break 
     } 
     $i += 1 
     $size += 16 
    } 
    } 
    else { 
    Write-Host 'Icon file not found' -ForegroundColor 'Red' 
    } 
} 

我提供的圖標,大小16wParam 1),32wParam 2),48wParam 3)和64wParam 4)。

我也嘗試從我啓動的C#應用​​程序(基於this Stackoverflow discussion)更改圖標,但根本不起作用。

如果你想看到完整的代碼看看以下內容:

+0

你是否得到這個工作?我對我的腳本有類似的要求。 –

+0

不,沒有機會。 – Fleshgrinder

+0

這是關於它的一些信息,但C#/ C++而不是PS:http://stackoverflow.com/q/2986853/143684第二個答案有一個C++代碼的博客文章。雖然這確實起作用,但任務將僅顯示初始應用程序圖標,而不會顯示動態窗口圖標。如果您使用7 Taskbar Tweaker(我的默認設置)取消組合窗口並且至少有兩個應用程序窗口,則只能看到它。畢竟不切實際。所以我會說這是一個任務欄限制。該圖標出現在其他地方(標題欄,Alt + Tab切換器)。 – ygoe

回答

0

這也許是不可能的。以下是有關任務欄中的「組圖標」更多:

Change icon of group in taskbar (Win7)

更新:

你可以改變你的窗口的應用程序ID。由於圖標主要來自應用程序ID,通過更改它,Explorer不再知道默認圖標,並將使用實際的窗口圖標。這也取消了其他CMD窗口的窗口組合,使個人圖標完全可見。 (有一個任務欄動畫像封閉式/新窗口,當你做到這一點在現有的控制檯窗口。)這裏有一個MSDN文章,查找在爲「應用程序ID」:

https://msdn.microsoft.com/en-us/magazine/dd942846.aspx

下面是相關的代碼它(C++):

#define WINVER 0x601 
#define _WIN32_WINNT 0x601 
#include <Propvarutil.h> 
#include <propkey.h> 
#include <Shellapi.h> 

PROPVARIANT pv; 
InitPropVariantFromString(L"MyAppID", &pv); 

IPropertyStore* pps; 
VERIFY(SHGetPropertyStoreForWindow(hwnd, IID_PPV_ARGS(&pps))); 
VERIFY(pps->SetValue(PKEY_AppUserModel_ID, pv)); 
VERIFY(pps->Commit()); 

(鏈接庫:shlwapi.lib)

在Windows API代碼包也應該有託管包裝的代碼這一點。沒有查找它,因爲我目前在C++應用程序中使用這個函數。但是我在這裏發現了關於它的其他問題。

對於您的PowerShell腳本,這可能不會有太大的幫助。由於它都是用更復雜的託管代碼包裝的本地代碼,我認爲你最好的選擇是一個本地輔助工具。我目前正在將此功能集成到我的FlashConsoleWindow工具中,該工具可以執行更多操作來控制窗口,如閃爍或顯示任務欄進度狀態。

1

一個簡單的方法是創建一個到powershell exe的快捷方式。將快捷方式的圖標更改爲任何你想要的。

然後,無論何時您調用腳本,請使用快捷鍵代替PS exe。因此,而不是

powershell.exe -ExecutionPolicy Bypass -File D:\scripts\whatever.ps1 

使用

D:\scripts\powershell.lnk -ExecutionPolicy Bypass -File D:\scripts\whatever.ps1 

快捷powershell.lnk可以是 「C:\ WINDOWS \ SYSTEM32 \ WindowsPowerShell \ V1.0 \ powershell.exe」 或只是powershell.exe沒有完整路徑(只要系統上的PS適當設置PATH var)

您可以將PS快捷方式放在任何地方,但我建議您將其與便攜式腳本放在一起。

現在,當您通過快捷方式啓動腳本時,任務欄圖標將成爲您通過快捷方式文件定義的任何內容。

唯一需要注意的是,快捷方式中的窗口設置將覆蓋PS窗口,因此您應該定義您希望在快捷方式屬性中查找的方式。

相關問題