如何删除Windows 7上的Java程序的标题栏和任务栏图标?

我已经写了一个小应用程序,禁用在C#中的Windows操作系统的所有窗口的标题栏和任务栏图标。 这里是代码:

using System; using System.Runtime.InteropServices; using System.Windows.Forms; namespace IconKiller { class Program { /// Import the needed Windows-API functions: // ... for enumerating all running desktop windows [DllImport("user32.dll")] static extern bool EnumDesktopWindows(IntPtr hDesktop, EnumDesktopWindowsDelegate lpfn, IntPtr lParam); private delegate bool EnumDesktopWindowsDelegate(IntPtr hWnd, int lParam); // ... for loading an icon [DllImport("user32.dll")] static extern IntPtr LoadImage(IntPtr hInst, string lpsz, uint uType, int cxDesired, int cyDesired, uint fuLoad); // ... for sending messages to other windows [DllImport("user32.dll")] static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam, IntPtr lParam); /// Setup global variables // Pointer to empty icon used to replace all other application icons static IntPtr m_pIcon = IntPtr.Zero; // Windows API standard values const int IMAGE_ICON = 1; const int LR_LOADFROMFILE = 0x10; const int WM_SETICON = 0x80; const int ICON_SMALL = 0; static void Main(string[] args) { // Load the empty icon string strIconFilePath = @"blank.ico"; m_pIcon = LoadImage(IntPtr.Zero, strIconFilePath, IMAGE_ICON, 16, 16, LR_LOADFROMFILE); // Setup the break condition for the loop int counter = 0; int max = 10 * 60 * 60; // Loop to catch new opened windows while (counter < max) { // enumerate all desktop windows EnumDesktopWindows(IntPtr.Zero, new EnumDesktopWindowsDelegate(EnumDesktopWindowsCallback), IntPtr.Zero); counter++; System.Threading.Thread.Sleep(100); } // ... then restart application Application.Restart(); } private static bool EnumDesktopWindowsCallback(IntPtr hWnd, int lParam) { // Replace window icon SendMessage(hWnd, WM_SETICON, ICON_SMALL, m_pIcon); return true; } } } 

这段代码似乎与原生Windows应用程序正常工作。 我现在唯一的问题是,Java显然使用了一个不同的应用程序图标实例来显示在任务栏中。 这意味着我的小应用程序删除了Java程序标题栏中的图标,但不是任务栏中的图标(Netbeans就是一个很好的例子)。

如何解决这个问题? 是否有可能通过JVM向这些程序传递消息,类似于我用于Windows API的技巧,在运行Java应用程序或类似的东西时调用JFrame.setIconImage()

编辑:我不只是C#,我非常愿意写一些像“助手”应用程序在Java中,我会执行在我的主要应用程序,如果有必要。

问题是使用EnumDesktopWindows而不是EnumWindows 。 以下代码在我的电脑上正常工作:

 using System; using System.Runtime.InteropServices; namespace IconKiller { class Program { /// Import the needed Windows-API functions: // ... for enumerating all running desktop windows [DllImport("user32.dll")] static extern bool EnumWindows(EnumDesktopWindowsDelegate lpfn, IntPtr lParam); private delegate bool EnumDesktopWindowsDelegate(IntPtr hWnd, int lParam); // ... for loading an icon [DllImport("user32.dll")] static extern IntPtr LoadImage(IntPtr hInst, string lpsz, uint uType, int cxDesired, int cyDesired, uint fuLoad); // ... for sending messages to other windows [DllImport("user32.dll")] static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam, IntPtr lParam); /// Setup global variables // Pointer to empty icon used to replace all other application icons static IntPtr m_pIcon = IntPtr.Zero; // Windows API standard values const int IMAGE_ICON = 1; const int LR_LOADFROMFILE = 0x10; const int WM_SETICON = 0x80; const int ICON_SMALL = 0; static void Main(string[] args) { // Load the empty icon string strIconFilePath = @"C:\clicknrun.ico"; m_pIcon = LoadImage(IntPtr.Zero, strIconFilePath, IMAGE_ICON, 16, 16, LR_LOADFROMFILE); // Setup the break condition for the loop int counter = 0; int max = 10 * 60 * 60; // Loop to catch new opened windows while (counter < max) { // enumerate all desktop windows EnumWindows((EnumDesktopWindowsCallback), IntPtr.Zero); counter++; System.Threading.Thread.Sleep(100); } // ... then restart application Console.WriteLine("done"); Console.ReadLine(); } private static bool EnumDesktopWindowsCallback(IntPtr hWnd, int lParam) { // Replace window icon SendMessage(hWnd, WM_SETICON, ICON_SMALL, m_pIcon); return true; } } } 

这是你在找什么?

 [DllImport("user32.dll")] static extern bool EnumDesktopWindows(IntPtr hDesktop, EnumDesktopWindowsDelegate lpfn, IntPtr lParam); private delegate bool EnumDesktopWindowsDelegate(IntPtr hWnd, int lParam); [DllImport("user32.dll")] private static extern int GetWindowText(IntPtr hWnd, StringBuilder title, int size); [DllImport("user32.dll")] private static extern bool IsWindowVisible(IntPtr hWnd); [DllImport("user32.dll")] static extern IntPtr LoadImage(IntPtr hInst, string lpsz, uint uType, int cxDesired, int cyDesired, uint fuLoad); [DllImport("user32.dll")] static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); static IntPtr m_pIcon = IntPtr.Zero; static string[] m_astrFilter = new string[] { "Start", "Program Manager" }; static void Main(string[] args) { string strIconFilePath = @"H:\IconEmpty.ico"; const int IMAGE_ICON = 1; const int LR_LOADFROMFILE = 0x10; m_pIcon = LoadImage(IntPtr.Zero, strIconFilePath, IMAGE_ICON, 0, 0, LR_LOADFROMFILE); while (true) { EnumDesktopWindows(IntPtr.Zero, new EnumDesktopWindowsDelegate(EnumDesktopWindowsCallback), IntPtr.Zero); System.Threading.Thread.Sleep(100); } Console.ReadKey(); } private static bool EnumDesktopWindowsCallback(IntPtr hWnd, int lParam) { StringBuilder title = new StringBuilder(256); GetWindowText(hWnd, title, 256); string strTitle = title.ToString(); bool bVisible = IsWindowVisible(hWnd); if (bVisible && // ... visible !String.IsNullOrEmpty(strTitle) && // ... has title !m_astrFilter.Contains(strTitle)) // ... not in filter list { SendMessage(hWnd, 0x80, IntPtr.Zero, m_pIcon); } return true; } 

您可以使用Windows API代码包来覆盖任务栏图标。 这里有一些例子 。