2009-04-15 16 views
11

最小化するときにシステムトレイにコンソールアプリケーションを配置する方法はありますか?私はC#。システムトレイ内の.Netコンソールアプリケーション

+2

いいえ、デュープではありません。これは、winformアプリケーションではなく、コンソールアプリケーションについて語っています。 – Sascha

+0

実際、私は欺瞞の提案を取り戻します。これは、コンソールアプリケーションについての質問です – JaredPar

+0

こんにちは、 をWinFormsのない私は、あまりにも上記のソリューションが...私はFindWindow関数件まで「CLaRGe」の提案を試してみました...しかし、MSDNの上の具体的な例を欠いてさらに進行couldntのきたいです"...コンソールはオンスクリーンで、最小化ボタンをクリックしてコンソールウィンドウを隠し、通知アイコンを更新するために使用します。" 誰もコンソールの最小化ボタンをクリックして非表示にする方法について、コンソールウィンドウを開き、通知アイコンを更新します。どんな提案も大歓迎です。 –

答えて

8

コンソールと.NET 3.5を使用

は、それ自体で最小限に抑えるために窓がありません。これは、コマンドプロンプトウィンドウで実行されます。ウィンドウメッセージをフックし、最小化時にウィンドウを非表示にすることができます。あなたのアプリケーションでは、トレイアイコンをウィンドウアプリケーションで行うのと同じように追加することができます。まあ、どういうわけかこのの臭い ...

しかし、私はあなたがこれをしたいとは思っていません。コンソールアプリケーションは、設計上、Windowsアプリケーションとは異なります。したがって、アプリケーションをWindowsフォームアプリケーションに変更することは可能でしょうか?

0

非表示にするウィンドウがコンソールにないため、コンソールアプリケーションを非表示にすることはできません。コンソールで実行されているものとして表示されます(コンソール自体はコンソールのウィンドウであり、 )

20

はい、これを行うことができます。 Windowsフォームアプリケーションを作成し、NotifyIcon componentを追加します。

その後

[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); 

は、あなたのコンソールが画面に表示される場合は、最小化ボタンのクリックをキャプチャし、コンソールウィンドウを隠し、通知アイコンを更新するためにそれを使用するコンソールを割り当て、表示するには、次の方法(found on MSDN)を使用します。あなたは、以下の方法(found on 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); 

は、アプリを閉じてする準備が整いましたびFreeConsoleを呼び出すようにしてください。

1
[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); 
} 
+2

このコードは、コンソールのみを最小限に抑えます。 –

2

私は正確にこの目的のためにTrayRunnerを使用します。基本的には、すべての出力をキャプチャするコンソールアプリケーションをラップします。しかし、最小化すると、タスクバーの代わりにシステムトレイに最小化されます。最小化したときに表示するアイコンをカスタマイズすることもできます。私はTomcatやApacheのようなものをWindowsサービスとして実行せずにタスクバーのスペースを解放するために使用します。

+0

Windows 10がTrayRunnerをマルウェアとして報告しました... – mafrosis

+1

Windows 10はマルウェアです。 :-) TrayRunnerに関しては、それはちょうど古いと思うし、Microsoftからのいくつかの新しい要件に準拠していないと思う。確かにマルウェアではありません。 –

+0

ジョブを完了させる最も速い方法。かなりベアボーンツール。 –

2
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    
    } 
} 
関連する問題