Question

Est-il possible que je peux mettre une application console dans la zone de notification lors de la réduction?

Était-ce utile?

La solution

Une console n'a pas de fenêtre pour minimiser par lui-même. Il fonctionne dans une fenêtre d'invite de commande. Vous pouvez accrocher les messages de fenêtre et masquer la fenêtre minimiser. Dans votre application, il est possible d'ajouter une icône de plateau la même chose que vous le feriez dans une application Windows. Eh bien, en quelque sorte ça sent ...

Mais: Je ne sais pas pourquoi vous voulez faire. Une application de la console est de conception différente d'une application Windows. Par conséquent, peut-être est une option pour changer l'application pour une application sous forme de fenêtres?

Autres conseils

Oui, vous pouvez le faire. Créer une application Windows Forms et ajoutez un NotifyIcon composante .

Ensuite, utilisez les méthodes suivantes ( trouve sur MSDN ) à allouer et afficher une console

[DllImport("kernel32.dll")]
public static extern Boolean AllocConsole();

[DllImport("kernel32.dll")]
public static extern Boolean FreeConsole();

[DllImport("kernel32.dll")]
public static extern Boolean AttachConsole(Int32 ProcessId);

Lorsque la console est à l'écran, capturer le clic de bouton de réduction et de l'utiliser pour cacher la fenêtre de la console et mettre à jour l'icône Notify. Vous pouvez trouver votre fenêtre en utilisant les méthodes suivantes ( trouvé sur MSDN ):

[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

// Find window by Caption only. Note you must pass IntPtr.Zero as the first parameter.
// Also consider whether you're being lazy or not.
[DllImport("user32.dll", EntryPoint="FindWindow", SetLastError = true)]
static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName);

Assurez-vous d'appeler FreeConsole chaque fois que vous êtes prêt à fermer l'application.

using System.Windows.Forms;
using System.Drawing;

static NotifyIcon notifyIcon = new NotifyIcon();
static bool Visible = true;
static void Main(string[] args)
{
    notifyIcon.DoubleClick += (s, e) =>
    {
        Visible = !Visible;
        SetConsoleWindowVisibility(Visible);
    };
    notifyIcon.Icon = Icon.ExtractAssociatedIcon(Application.ExecutablePath);
    notifyIcon.Visible = true;
    notifyIcon.Text = Application.ProductName;

    var contextMenu = new ContextMenuStrip();
    contextMenu.Items.Add("Exit", null, (s, e) => { Application.Exit(); });
    notifyIcon.ContextMenuStrip = contextMenu;

    Console.WriteLine("Running!");

    // Standard message loop to catch click-events on notify icon
    // Code after this method will be running only after Application.Exit()
    Application.Run(); 

    notifyIcon.Visible = false;
}

[DllImport("user32.dll")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
public static void SetConsoleWindowVisibility(bool visible)
{
    IntPtr hWnd = FindWindow(null, Console.Title);
    if (hWnd != IntPtr.Zero)
    {
        if (visible) ShowWindow(hWnd, 1); //1 = SW_SHOWNORMAL           
        else ShowWindow(hWnd, 0); //0 = SW_HIDE               
    }
}

J'utilise TrayRunner dans ce but précis. Pour l'essentiel, il enveloppe une application console capture toutes les sorties. Mais lorsqu'il est réduit, il réduit au plateau de système au lieu de la barre des tâches. Vous pouvez même personnaliser ce que l'icône pour afficher une fois réduit. Je l'utilise pour des choses comme Tomcat ou Apache pour libérer de l'espace sur ma barre des tâches sans les exécuter en tant que services Windows.

[DllImport("user32.dll")]
internal static extern bool SendMessage(IntPtr hWnd, Int32 msg, Int32 wParam, Int32 lParam);
static Int32 WM_SYSCOMMAND = 0x0112;
static Int32 SC_MINIMIZE = 0x0F020;

static void Main(string[] args)
{
    SendMessage(Process.GetCurrentProcess().MainWindowHandle, WM_SYSCOMMAND, SC_MINIMIZE, 0);
}

Vous ne pouvez pas cacher une application console, car il ne fait pas une fenêtre pour se cacher, car la façon dont il est en cours d'exécution dans la console (la console elle-même est juste une fenêtre de la console, et non l'application en cours d'exécution en elle)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top