J'ai écrit une petite application qui désactive la barre de titre la barre des tâches et les icônes de toutes les fenêtres du système d'exploitation Windows en C#. Voici le code:
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;
}
}
}
Ce code semble fonctionner correctement avec windows natif des applications. Mon seul problème est maintenant que Java appearently utilise un autre exemple de son icône de l'application à afficher dans la barre des tâches. Ce qui signifie que ma petite application supprime l'icône dans la barre de titre des programmes Java, mais pas le seul dans la barre des tâches (Netbeans est un bon exemple).
Ma question serait de savoir comment résoudre ce problème. C'est peut-être possible de faire passer un message à ces programmes par le biais de la JVM, la même ruse que j'ai utilisé avec l'API de windows, à l'appel JFrame.setIconImage()
sur l'exécution des applications Java ou quelque chose le long de ces lignes?
EDIT: je ne suis pas lié à juste C#, je suis très disposé à écrire quelque chose comme un "helper" application en java que j'ai exécuté dans mon application principale, il devrait être nécessaire.
Je vous remercie d'avance pour toute aide apportée