2010-06-07 163 views
4

我不想更改EXE中顯示在Windows資源管理器中的實際圖標,但只是顯示在控制檯窗口左上角的圖標。我已經在visual studio項目中設置了圖標,並且我在Windows資源管理器中很好地獲得了該圖標,並且該圖標顯示在控制檯窗口中,我只是希望能夠在運行時在控制檯窗口中對其進行更改。我可以說我想放一個顯示有新電子郵件或其他東西的圖​​標。有沒有辦法在運行時更改控制檯圖標

+0

你倆這兩個答案的工作您? – Josh 2010-06-08 04:35:31

回答

5

上Leniel的回答之後,我想做這在C#WinForms應用程序。他貼到這個鏈接是C++ ..基本上這裏是你所需要的代碼,如果你想要做這在C#:

[DllImport("kernel32.dll", SetLastError = true)] 
static extern bool SetConsoleIcon(IntPtr hIcon); 

,並調用它像這樣:

public static void SetConsoleIcon(System.Drawing.Icon icon) 
     { 
      SetConsoleIcon(icon.Handle); 
     } 

我有我的WinForms應用程序,使該顯示控制檯窗口藏漢能力使用ConsoleWindow類。這裏是滿級高清

class ConsoleWindow 
    { 
     [DllImport("kernel32.dll", SetLastError = true)] 
     static extern bool AllocConsole(); 

     [DllImport("kernel32.dll")] 
     static extern bool AttachConsole(int dwProcessId); 
     private const int ATTACH_PARENT_PROCESS = -1; 

     [DllImport("kernel32.dll")] 
     static extern IntPtr GetConsoleWindow(); 

     [DllImport("user32.dll")] 
     static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); 

     [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] 
     static extern bool SetWindowText(IntPtr hwnd, String lpString); 

     [DllImport("user32.dll")] 
     static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert); 

     [DllImport("user32.dll")] 
     static extern bool EnableMenuItem(IntPtr hMenu, uint uIDEnableItem, uint uEnable); 

     [DllImport("kernel32.dll", SetLastError = true)] 
     static extern bool SetConsoleIcon(IntPtr hIcon); 

     const int SW_HIDE = 0; 
     const int SW_SHOW = 5; 

     const int SC_CLOSE = 0xF060; 
     const int MF_GRAYED = 1; 

     public static void AttachConsoleWindow() 
     { 
      // redirect console output to parent process; 
      // must be before any calls to Console.WriteLine() 
      AttachConsole(ATTACH_PARENT_PROCESS); 
     } 

     public static void ShowConsoleWindow() 
     { 
      var handle = GetConsoleWindow(); 

      if (handle == IntPtr.Zero) 
      { 
       AllocConsole(); 
      } 
      else 
      { 
       ShowWindow(handle, SW_SHOW); 
      } 
     } 

     public static void HideConsoleWindow() 
     { 
      var handle = GetConsoleWindow(); 

      ShowWindow(handle, SW_HIDE); 
     } 

     public static void SetWindowText(string text) 
     { 
      var handle = GetConsoleWindow(); 

      SetWindowText(handle, text); 
     } 

     public static void DisableCloseButton() 
     { 
      var handle = GetConsoleWindow(); 

      var hmenu = GetSystemMenu(handle, false); 

      EnableMenuItem(hmenu, SC_CLOSE, MF_GRAYED); 
     } 

     public static void SetConsoleIcon(System.Drawing.Icon icon) 
     { 
      SetConsoleIcon(icon.Handle); 
     } 
    } 
+0

這是否在Win7上工作?我可以用它來改變Firefox的任務欄中的圖標嗎? – Noitidart 2014-07-04 00:29:33

+0

嗨Noitidart。 呃,是的,我想是的。 你將需要pinvoke更多的Windows API的。 查看EnumDesktopWindows和GetWindowText。 http://www.pinvoke.net/default.aspx/user32/EnumDesktopWindows.html 該頁面上有一些示例代碼甚至可以調用GetWindowText,因此它看起來像所有的繁重工作都已經完成.. 在桌面窗口的每次迭代中,您都可以調用GetWindowText來獲取窗口的標題。 當您找到您感興趣的窗口後,一旦您有窗口句柄,就可以使用它來更改圖標的窗戶。 – 2015-01-24 09:09:20

+0

謝謝@adrian :)我試過這樣做,但Firefox不是控制檯嗎?我是WinAPI的noob,仍然試圖做到這一點:P還是會拼命解決這個問題? – Noitidart 2015-01-24 14:16:14

1

由於意見在Josh的答覆中提到似乎已經消失,這裏是C++代碼來做到這一點:

HMODULE hKernel32 = ::LoadLibrary(_T("kernel32.dll")); 
typedef BOOL (_stdcall * SetConsoleIconFunc)(HICON); 
SetConsoleIconFunc setConsoleIcon 
    = (SetConsoleIconFunc)::GetProcAddress(hKernel32, "SetConsoleIcon"); 
if (setConsoleIcon != NULL) 
    setConsoleIcon(m_hIcon); 
::FreeLibrary(hKernel32); 
相關問題