如何在Windows7上删除Java程序的标题栏和任务栏图标
本文关键字:标题栏 任务栏 图标 程序 Java Windows7 删除 | 更新日期: 2023-09-27 18:20:42
我写了一个小应用程序,在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代码包覆盖任务栏图标。下面是一些例子。