このグループに投稿するべきでないのかもしれませんが、ご容赦ください。
Win32コンソールアプリケーションを実行するとDOS窓が勝手に開きますが、この窓を
最小化もしくは消すことは可能でしょうか?
ここの過去ログで、別プログラムからコンソールアプリを起動した場合の上記の方法
は、CreateProcessの引数で可能との事でした。 しかし訳あって単独で実行する場
合に行いたいのです。
ご教示の程、宜しくお願いいたします。
> Win32コンソールアプリケーションを実行するとDOS窓が勝手に開きますが、この窓
を
> 最小化もしくは消すことは可能でしょうか?
> 訳あって単独で実行する場合に行いたいのです。
プログラム的な解決方法ではないですが、DOSプログラムに対するショートカット
を作成して、そのショートカット上で、右クリックし、でてきたメニューでプロパ
ティを選択し、でてきたダイアログの[プログラム]タブの中の、「実行時の大き
さ」から「最小化」を選べば、プログラムウィンドウが最小化されて実行されます。
こんなもんでよろしいでしょうか?
**************************************
*** 田淵義弘 in SPOONsoftware
*** E-Mail : tab...@spoonsoftware.com
*** HP : http://www.spoonsoftware.com
**************************************
ご助言ありがとうございました。
できればプログラムの中から何某かのAPIを呼ぶことにより、最小化状態にすること
ができれば、と思ったのですが.. なかなか難しいようですね。
今後とも宜しくお願いいたします。
HANDLE hWnd;
hWnd = FindWindow( "ConsoleWindowClass", "WindowTitile" );
/* WindowTitleはコンソールアプリのタイトルバーの内容 */
SendMessage( (HWND)hWnd, WM_SYSCOMMAND, SC_MINIMIZE, 0 );
windows.hをインクリュードしてください
システムコマンドの最小化コマンドを自分自身に
投げてやればいいのではないでしょうか
そのときウィンドウのハンドルが必要になるので
FindWindowにて自分のハンドルを取得しています
# もっとスマートなやり方もあるかも
以上参考になれば幸いです
--
高橋政宏 red_...@hotmail.com
『返信はグループへ!』
???
既に立ち上がっている(プログラムとは別の手段で立ち上がった)コンソールに対
して、最小化すると言うことでしょうか?そうであれば、コンソールウィンドウへの
ハンドルを取得して、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クライアントに対
して有効です。
引き続き、沢山のご意見、並びにサンプルまで作成して頂き、大変感謝しておりま
す。
ご教示頂きました方法をもとに最終的には、
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 でしょう。
> link error ですか?
> cl -Fefoo.exe foo.c user32.lib
> で OK でしょう。
いえいえ、コンパイルエラーが発生しまして...
実はwindow.hに定義されている定義名と同じものを使っていたことが判明し、エラー
になってしまいました。
お気遣いありがとうございました。今後とも宜しくお願いいたします。
コンソールアプリケーションは実行ファイル名がWindowタイトル名になるので、問
題ないのでは?
--
- 目的のプログラムが複数起動される場合がありうる
- xxx.lnkなどから起動される、タイトルがモジュール名じゃない
なんて場合が考えられるのであれば、大げさですが
1) GetConsoleTitle() で現状のタイトルを拾って
2) 何らかのユニークな名前を作って(プロセスIDなんかで生成可能か?)
3) 念のため新タイトルでFindWindows()してみて、無いことを確認し
4) SetConsoleTitle()でユニークな新タイトルをセットして
5) FindWindow()でウインドウハンドルをひろって
6) SC_MINIMIZE を投げて
7) SetConsoleTitle()でオリジナルに戻す
くらいの安全対策がいるかもしれないです。
# なんかもっと簡単な方法がありそうな気もする。
--
DYO
杉原です。お世話になっております。
> 当初のテーマである「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;
}
お役に立ててよかったです。
やりたいことから考えると、コンソールアプリケーションで開発するのではなく、
Win32 Applicationで開発し、WinMainからスタートさせるようにすれば、手っ取り早
く出来たような気もしますね。(コンソール自体が表示されない)
では、
あと、自分自身のコンソールウィンドウのタイトルを取得する
GetConsoleTitle
と言う便利なAPIも存在します。GetModuleFileNameを使うよりは確実ではないでしょ
うか?
やはり、やりたいことを最初に書くというのは基本かな?
杉原です。お世話になっております。
いろいろとご教授頂き、誠にありがとうございます。
> やりたいことから考えると、コンソールアプリケーションで開発するのではな
く、
> Win32 Applicationで開発し、WinMainからスタートさせるようにすれば、手っ取り
早
> く出来たような気もしますね。(コンソール自体が表示されない)
そうでした。DOS→MFCときたもので、Win32 Applicationの知識に乏しく、Consoleア
プリでやってしまいました。(^^;;
今後とも宜しくお願いいたします。
#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...