Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Win32コンソールアプリのDOS窓を最 小化する方法

3 views
Skip to first unread message

Kohki Sugihara

unread,
Sep 2, 2002, 7:32:34 AM9/2/02
to
杉原@VC初心者です。 こんにちは。

このグループに投稿するべきでないのかもしれませんが、ご容赦ください。

Win32コンソールアプリケーションを実行するとDOS窓が勝手に開きますが、この窓を
最小化もしくは消すことは可能でしょうか?
ここの過去ログで、別プログラムからコンソールアプリを起動した場合の上記の方法
は、CreateProcessの引数で可能との事でした。 しかし訳あって単独で実行する場
合に行いたいのです。

ご教示の程、宜しくお願いいたします。

seraphy

unread,
Sep 2, 2002, 8:27:48 AM9/2/02
to
ショートカットをつくって、そこから起動すればいいだけでは?

> Win32コンソールアプリケーションを実行するとDOS窓が勝手に開きますが、この窓

> 最小化もしくは消すことは可能でしょうか?
> 訳あって単独で実行する場合に行いたいのです。


Yoshihiro Tabuchi

unread,
Sep 2, 2002, 8:33:05 AM9/2/02
to

 プログラム的な解決方法ではないですが、DOSプログラムに対するショートカット
を作成して、そのショートカット上で、右クリックし、でてきたメニューでプロパ
ティを選択し、でてきたダイアログの[プログラム]タブの中の、「実行時の大き
さ」から「最小化」を選べば、プログラムウィンドウが最小化されて実行されます。
 こんなもんでよろしいでしょうか?

**************************************
*** 田淵義弘 in SPOONsoftware
*** E-Mail : tab...@spoonsoftware.com
*** HP : http://www.spoonsoftware.com
**************************************

Kohki Sugihara

unread,
Sep 2, 2002, 9:10:34 PM9/2/02
to
seraphy様、田淵様

ご助言ありがとうございました。

できればプログラムの中から何某かのAPIを呼ぶことにより、最小化状態にすること
ができれば、と思ったのですが.. なかなか難しいようですね。

今後とも宜しくお願いいたします。

don_mai

unread,
Sep 2, 2002, 10:21:34 PM9/2/02
to
やはりCreateProcessでしょう。(WinExecでも可能でしょう)
Window表示の状態はShowWindow参照。
ところで、元記事に書いてあった「訳あって単独で実行する場合に行いたいので
す。」という「単独で実行する」とはどういう意味なんですかね。
今回の記事で書いてある「プログラムの中から何某かのAPIを呼ぶ」という意味なん
でしょうか?
"Kohki Sugihara" <sugiha...@nikon.co.jp> wrote in message
news:#c8FUauUCHA.3556@tkmsftngp08...
> できればプログラムの中から何某かのAPIを呼ぶことにより、最小化状態にするこ

> ができれば、と思ったのですが..

Masahiro Takahashi

unread,
Sep 2, 2002, 10:43:07 PM9/2/02
to
高橋です

"Kohki Sugihara" <sugiha...@nikon.co.jp> wrote in message
news:#c8FUauUCHA.3556@tkmsftngp08...
> できればプログラムの中から何某かのAPIを呼ぶことにより、最小化状態にするこ

> ができれば、と思ったのですが.. なかなか難しいようですね。

HANDLE hWnd;
hWnd = FindWindow( "ConsoleWindowClass", "WindowTitile" );
/* WindowTitleはコンソールアプリのタイトルバーの内容 */
SendMessage( (HWND)hWnd, WM_SYSCOMMAND, SC_MINIMIZE, 0 );

windows.hをインクリュードしてください

システムコマンドの最小化コマンドを自分自身に
投げてやればいいのではないでしょうか

そのときウィンドウのハンドルが必要になるので
FindWindowにて自分のハンドルを取得しています
# もっとスマートなやり方もあるかも
以上参考になれば幸いです
--
高橋政宏 red_...@hotmail.com
『返信はグループへ!』


Yoshihiro Tabuchi

unread,
Sep 2, 2002, 11:28:56 PM9/2/02
to
> ご助言ありがとうございました。

>
> できればプログラムの中から何某かのAPIを呼ぶことにより、最小化状態にするこ

> ができれば、と思ったのですが.. なかなか難しいようですね。

???
 既に立ち上がっている(プログラムとは別の手段で立ち上がった)コンソールに対
して、最小化すると言うことでしょうか?そうであれば、コンソールウィンドウへの
ハンドルを取得して、ShowWindowでSW_SHOWMINIMIZEDを指定すればできます。(もし
必要なら、SW_HIDEを指定すれば見た目は完全に消えてくれます)。
 ウィンドウハンドルをどうやって取得するかという問題が出てきますが、一般的に
はEnumWindowsを呼び出して、コールバック関数内で、ウィンドウハンドルからウィ
ンドウテキストを取得し(GetWindowText)、立ち上げているプログラム名の文字列
が見つかったらそれを最小化してやればよいでしょう。
 興味があったので、サンプル作ってみました。下記のコードでは、立ち上がってい
るWindows2000デフォルトのTELNETクライアントが最小化されます。参考にしてくだ
さい。では

----------------------以下サンプルコード----------------------
#include <windows.h>
#include <string.h>

/*コールバック関数のプロトタイプ宣言*/
BOOL CALLBACK MyEnumWindowsProc( HWND hwnd, LPARAM lParam );

/*メインルーチン*/
main()
{
/*すべてのトップレベルウィンドウのハンドルを取得する*/
EnumWindows( (WNDENUMPROC)MyEnumWindowsProc , 0L );
return 0;
}

/*EnumWindowsのコールバック関数*/
BOOL CALLBACK MyEnumWindowsProc( HWND hwnd, LPARAM lParam )
{
char szWindowName[256];

/*ウィンドウ名の取得*/
GetWindowText( hwnd , szWindowName , 256 );

/*ウィンドウ名にTELNETクライアントアプリケーションが含まれていたら最小化す
る*/
if( strstr( szWindowName , "C:\\WINNT\\System32\\telnet.exe" ) != NULL ){
ShowWindow( hwnd , SW_SHOWMINIMIZED );
}

return TRUE;
}

----------------------ここまで----------------------
実行する前に、[ファイル名を指定して実行]でtelnetを立ち上げてから行ってくだ
さい。ちなみに上記プログラムはWindows2000バージョンのTELNETクライアントに対
して有効です。

Yoshihiro Tabuchi

unread,
Sep 2, 2002, 11:32:02 PM9/2/02
to
FindWindowを使うという手もありましたね...

Kohki Sugihara

unread,
Sep 3, 2002, 2:00:56 AM9/3/02
to
don_mai様、高橋様、田淵様

引き続き、沢山のご意見、並びにサンプルまで作成して頂き、大変感謝しておりま
す。

ご教示頂きました方法をもとに最終的には、

int main(int argc, char* argv[])
{
HANDLE hWnd;
char mname[MAX_PATH+1];

GetModuleFileName(NULL, mname, MAX_PATH);
hWnd = FindWindow(NULL, mname);


SendMessage( (HWND)hWnd, WM_SYSCOMMAND, SC_MINIMIZE, 0 );

.
.
.
.
とすることで、目的の動作を実現出来そうです。(ちょっとwindows.hをインクルー
ドすることで別件でエラーが発生し、最終的にはまだ確認していないのですが)

ありがとうございました。
今後とも宜しくお願いいたします。


Akira Kakuto

unread,
Sep 3, 2002, 4:04:55 AM9/3/02
to
"Kohki Sugihara" <sugiha...@nikon.co.jp> wrote in message
news:O$1ph8wUCHA.1900@tkmsftngp13...

> ご教示頂きました方法をもとに最終的には、
>
> int main(int argc, char* argv[])
> {
> HANDLE hWnd;
> char mname[MAX_PATH+1];
>
> GetModuleFileName(NULL, mname, MAX_PATH);
> hWnd = FindWindow(NULL, mname);
> SendMessage( (HWND)hWnd, WM_SYSCOMMAND, SC_MINIMIZE, 0 );
> .
> .
> .
> .
> とすることで、目的の動作を実現出来そうです。(ちょっとwindows.hをインクルー
> ドすることで別件でエラーが発生し、最終的にはまだ確認していないのですが)

link error ですか?
cl -Fefoo.exe foo.c user32.lib
で OK でしょう。


Kohki Sugihara

unread,
Sep 3, 2002, 4:49:25 AM9/3/02
to
Kakuto様

> link error ですか?
> cl -Fefoo.exe foo.c user32.lib
> で OK でしょう。

いえいえ、コンパイルエラーが発生しまして...
実はwindow.hに定義されている定義名と同じものを使っていたことが判明し、エラー
になってしまいました。

お気遣いありがとうございました。今後とも宜しくお願いいたします。

don_mai

unread,
Sep 3, 2002, 6:20:30 AM9/3/02
to
これでは動作しないのでは?
GetModuleFileNameの行は不要でしょう。
GetModuleFileNameは実行プログラムのファイル名を取得します。
FindWindowの第2パラメータはWindowのタイトルを指定します。
--下記でいいはずです。
HANDLE hWnd;
hWnd = FindWindow(NULL, "Windowのタイトル");
SendMessage( hWnd, WM_SYSCOMMAND, SC_MINIMIZE, 0 );

Yoshihiro Tabuchi

unread,
Sep 3, 2002, 8:26:19 AM9/3/02
to
> これでは動作しないのでは?
> GetModuleFileNameの行は不要でしょう。
> GetModuleFileNameは実行プログラムのファイル名を取得します。
> FindWindowの第2パラメータはWindowのタイトルを指定します。
> --下記でいいはずです。
> HANDLE hWnd;
> hWnd = FindWindow(NULL, "Windowのタイトル");
> SendMessage( hWnd, WM_SYSCOMMAND, SC_MINIMIZE, 0 );
>

 コンソールアプリケーションは実行ファイル名がWindowタイトル名になるので、問
題ないのでは?
--

Kazumi Yoshida

unread,
Sep 3, 2002, 9:50:23 AM9/3/02
to
In article <al29lf$sb9$1...@ml.accsnet.ne.jp>,
"Yoshihiro Tabuchi" <tab...@spoonsoftware.com> wrote:
> コンソールアプリケーションは実行ファイル名がWindowタイトル名になるので、問
>題ないのでは?

- 目的のプログラムが複数起動される場合がありうる
- xxx.lnkなどから起動される、タイトルがモジュール名じゃない

なんて場合が考えられるのであれば、大げさですが

1) GetConsoleTitle() で現状のタイトルを拾って
2) 何らかのユニークな名前を作って(プロセスIDなんかで生成可能か?)
3) 念のため新タイトルでFindWindows()してみて、無いことを確認し
4) SetConsoleTitle()でユニークな新タイトルをセットして
5) FindWindow()でウインドウハンドルをひろって
6) SC_MINIMIZE を投げて
7) SetConsoleTitle()でオリジナルに戻す

くらいの安全対策がいるかもしれないです。

# なんかもっと簡単な方法がありそうな気もする。

--
DYO

don_mai

unread,
Sep 3, 2002, 6:12:29 PM9/3/02
to
つい私が日常やっている方法(ファイル名とタイトル名は異なる名前で運用)しか考
えずに書いてしまいました。申し訳ありません。
ところでKohki Sugiharaさんへの質問なのですが、
当初のテーマである「Win32コンソールアプリのDOS窓を最小化する方法」という
のは解決したのでしょうか?
「カレントWindowを最小化する方法(又は隠す方法)」という意味ならわかるのです
が、
当初のテーマとは異なるような気がして、どうも気になります。


Kohki Sugihara

unread,
Sep 3, 2002, 10:14:03 PM9/3/02
to
don_mai様

杉原です。お世話になっております。

> 当初のテーマである「Win32コンソールアプリのDOS窓を最小化する方法」とい

> のは解決したのでしょうか?

先の私のメールに記述しました方法で、デバッグモードで1行ずつステップで実行す
ると問題なく最小化したので、大丈夫かと思っていたのですが、通常に実行すると、
動作しません(最小化されない)でした...
もしかするとFindWidowは自分自身のハンドルは取れないのでは、と思いましたが、
当たり前のことでしょうか?デバッグモードではデバッガと別にウインドウが存在し
ている為、問題なく動作するとか...知識不足で詳しいことは分からないのです
が。(^^;

そこで、昨日、田淵様より頂きましたサンプルをもとに、以下のようにコーディング
したところ、問題なく最小化され実行することができました。
最初に書くべきでしたが、やりたいことは、コンソールアプリで単純にデータ変換し
て終了するだけのプログラムですが、DOS窓が開いていると目障りなので、起動と同
時に最小化したかったのです。

いろいろとご助言頂き、ありがとうございました。


#include "stdafx.h"
#include <windows.h>
#include <stdlib.h>

BOOL CALLBACK MyEnumWindowsProc(HWND hwnd, LPARAM lParam);

int main(int argc, char* argv[])
{

char mname[MAX_PATH + 1];

GetModuleFileName(NULL, mname, MAX_PATH);
EnumWindows((WNDENUMPROC)MyEnumWindowsProc , (LPARAM)mname);


do {
//処理
}while(1);

return 0;
}

BOOL CALLBACK MyEnumWindowsProc( HWND hwnd, LPARAM lParam )
{

char szWindowName[MAX_PATH + 1];
LPCSTR p;


GetWindowText(hwnd , szWindowName , 256);
p = (LPCSTR)lParam;

if (strstr(szWindowName , p) != NULL) {
ShowWindow(hwnd , SW_SHOWMINIMIZED);
}

return TRUE;
}


Yoshihiro Tabuchi

unread,
Sep 3, 2002, 11:05:32 PM9/3/02
to
> そこで、昨日、田淵様より頂きましたサンプルをもとに、以下のようにコーディン

> したところ、問題なく最小化され実行することができました。
> 最初に書くべきでしたが、やりたいことは、コンソールアプリで単純にデータ変換

> て終了するだけのプログラムですが、DOS窓が開いていると目障りなので、起動と

> 時に最小化したかったのです。
>
> いろいろとご助言頂き、ありがとうございました。
>

 お役に立ててよかったです。
 やりたいことから考えると、コンソールアプリケーションで開発するのではなく、
Win32 Applicationで開発し、WinMainからスタートさせるようにすれば、手っ取り早
く出来たような気もしますね。(コンソール自体が表示されない)
 では、

Yoshihiro Tabuchi

unread,
Sep 3, 2002, 11:19:37 PM9/3/02
to
> 最初に書くべきでしたが、やりたいことは、コンソールアプリで単純にデータ変換

> て終了するだけのプログラムですが、DOS窓が開いていると目障りなので、起動と

> 時に最小化したかったのです。
>

あと、自分自身のコンソールウィンドウのタイトルを取得する

GetConsoleTitle

と言う便利なAPIも存在します。GetModuleFileNameを使うよりは確実ではないでしょ
うか?
 やはり、やりたいことを最初に書くというのは基本かな?

Kohki Sugihara

unread,
Sep 3, 2002, 11:48:01 PM9/3/02
to
田淵様

杉原です。お世話になっております。

いろいろとご教授頂き、誠にありがとうございます。

> やりたいことから考えると、コンソールアプリケーションで開発するのではな
く、
> Win32 Applicationで開発し、WinMainからスタートさせるようにすれば、手っ取り

> く出来たような気もしますね。(コンソール自体が表示されない)

そうでした。DOS→MFCときたもので、Win32 Applicationの知識に乏しく、Consoleア
プリでやってしまいました。(^^;;

今後とも宜しくお願いいたします。


YoH

unread,
Sep 11, 2002, 10:02:25 AM9/11/02
to
Windows 2000以降であればGetConsoleWindowがつかえます。

#define _WIN32_WINNT 0x0500
#include <windows.h>

int main(int argc, char* argv[]){

SendMessage(GetConsoleWindow(), WM_SYSCOMMAND, SC_MINIMIZE,0);
return 0;
}

"Kohki Sugihara" <sugiha...@nikon.co.jp> wrote in message

news:#c8FUauUCHA.3556@tkmsftngp08...

YoH

unread,
Sep 11, 2002, 10:09:24 AM9/11/02
to
最小化せずに消してしまうのなら、FreeConsole();が利用できます。
こちらは、NT3.1 win95 以降なら使えるはずです。

#include <windows.h>
int main(int argc, char* argv[]){
FreeConsole();
return 0;
}


0 new messages