Pergunta

Existe uma maneira eu posso colocar um aplicativo de console na bandeja do sistema quando minimizando?

Foi útil?

Solução

A consola tem nenhuma janela para minimizar por si só. Ele é executado em uma janela do prompt de comando. Você pode ligar as mensagens de janela e ocultar a janela de minimizar. Em seu aplicativo, é possível adicionar um ícone na bandeja da mesma forma como você faria isso em um aplicativo do Windows. Bem, de alguma forma este cheiros ...

Mas: Eu não sei por que você quer fazer isso. Um aplicativo de console é por design diferente para um aplicativo do Windows. Por isso, talvez seja uma opção para alterar o aplicativo para ser um windows formulário de candidatura?

Outras dicas

Sim, você pode fazer isso. Criar um aplicativo Windows Forms e adicionar um NotifyIcon componente .

Em seguida, use os seguintes métodos ( encontrado na MSDN ) para alocar e exibir um 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);

Quando seu console está na tela, captura a minimizar clique de botão e usá-lo para esconder a janela do console e atualizar o ícone do Notify. Você pode encontrar sua janela usando os seguintes métodos ( encontrado na 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);

Certifique-se de chamar FreeConsole Sempre que você está pronto para fechar o aplicativo.

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               
    }
}

Eu uso TrayRunner exatamente para este fim. Essencialmente, ele envolve uma aplicação de consola capturar todas as saídas. Mas quando minimizado, minimiza à bandeja do sistema em vez da barra de tarefas. Você pode até personalizar o ícone para mostrar quando minimizado. Eu usá-lo para coisas como Tomcat ou Apache para liberar espaço na minha barra de tarefas, sem executá-los como Serviços do 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);
}

Você não pode esconder uma aplicação de consola, porque ele realmente não têm uma janela para esconder, vendo como ele está sendo executado no console (o console em si é apenas uma janela do console, e não o aplicativo em execução no mesmo)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top