- ベストアンサー
Console Applicationをタスクトレイに常駐できますか?
タイトル通りの質問です。 あんまりそういうソフト見たこと無いので、もしかしたら 出来ないんじゃないかと思ったりもしています。 Console Applicationをタスクトレイに常駐できるのでしょうか? 以上よろしくお願いします。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
>ところで裏で常駐するコンソールアプリは、出来ればスタートアップで >起動させたいのですが、起動後、タスクバーに表示させないように出来るでしょうか? 参考URLにはWindowsNT系では という限定付きで出来るような事が書いてあります。 この場合は、コンソールアプリケーションを制御するアプリケーション経由で CreateProcess()を使って起動する必要がありますね。
その他の回答 (6)
- mkii
- ベストアンサー率40% (43/105)
> この先、メンテなどで表示する必要が出てくる場合は > 表示、非表示の情報をINIファイルから読み込んで > CreateProcess()の引数を操作しようと思っているのですが、 > いかがなものでしょうか? それでもいいですけど、アプリケーションのオプションにする という手もありますよ。 xxx.exe /d デバッグオプション みたいなやつです。
- alfeim
- ベストアンサー率58% (114/195)
>mkiiさん これってなんか目的のものと違うと思いますけど・・・ これってUNIXでの端末無しでのコマンド実行(標準出力が/dev/nullになる)と同じなのでは? また、このFAQのだと、バックグラウンドでプロセスは走りますが、ウィンドウをアクティブに出来ません。(ShowWindow()しようにも対象のWindowHandleが無い) なので >起動後、タスクバーに表示させないように出来るでしょうか? はOKですが、その後、そのWindowをActiveに出来ません。
補足
基本的に表示する必要があるものがないので、何も表示されなくても構わないのです。 この先、メンテなどで表示する必要が出てくる場合は 表示、非表示の情報をINIファイルから読み込んで CreateProcess()の引数を操作しようと思っているのですが、 いかがなものでしょうか?
- alfeim
- ベストアンサー率58% (114/195)
出来なくは無い、と思います ただ、通常のConsoleApplicationプロジェクトではなく、WindowApplicationで作成し、そのプログラム内でAllocConsole、FreeConsoleしてやる必要があるでしょうが・・・ タスクトレイにアイコンを常駐させるため、CreateWindowしてそのウィンドウを非表示にしておく必要もあるでしょう。(タスクトレイでのイベントはこの非表示ウィンドウのウィンドウプロシージャで受け取り、処理させます) んー、でもこの方法だとConsoleに来るイベントを取得できないですねぇ 最小化イベント発生時にタスクバーではなく、タスクトレイに引っ込めるような挙動をさせるのであればグローバルフックでメッセージをトラップする必要があるんですが・・・たしか出来なかったような・・・ 構造的に無理臭い部分があるのは確かですね まっとうな方法としてはWin32ベースでConsoleを自作するのが妥当でしょうね
- mkii
- ベストアンサー率40% (43/105)
質問されている事とは異なってしまいますが、 コンソールアプリケーションは裏で常駐として、 そのコンソールアプリケーションを制御するアプリケーション(起動・終了等) をタスクトレイに常駐させる というのが一般的な作りではないでしょうか。
補足
このやり方は目から鱗でした。 ところで裏で常駐するコンソールアプリは、出来ればスタートアップで 起動させたいのですが、起動後、タスクバーに表示させないように出来るでしょうか?
- a-kuma
- ベストアンサー率50% (1122/2211)
> Console Applicationをタスクトレイに常駐できるのでしょうか? できないんじゃないかなあ。 タスクトレイにプログラムを登録する API Shell_NotifyIcon() では、 引数の構造体に、タスクトレイのアイコンをクリックしたときのメッセージを 通知するウィンドウのハンドルを指定するようになっている。 ウィンドウを作成する為には、アプリケーションのインスタンスハンドルが 必要だけど、Console Application では、それが手に入らない(Window アプリケーションであれば WinMain の引数として手に入れられる)。 やったことはないけど、メッセージの通知先ハンドルを NULL にしても 登録できちゃうかもしれない。でも、喩え、登録できたとしても、メッセージの 処理ができないんだったら、タスクトレイにアイコンをただ表示しているだけ なので、常駐しているプログラムの意味が無いもんね。
やれないことはないのでは? 少し前のApache+ApacheRapperはそんな感じで 動作していましたよ。 要するにコンソールアプリケーションの実行画面を 非表示にするようにタスクトレイに常駐するソフトで 制御してやれば、何とかなるのでは? ではでは☆
お礼
URL拝見しました。丁度開発環境がNTだったんですよ。(^^ CreateProcess()を使えば画面表示させずに起動できそうですね。 これからCreateProcess()の引数を勉強します(^^;