none
AllocConsole を非表示にする方法 ? RRS feed

  • 質問

  •  

      こんにちは。

     

    「標準出力(コンソール)に文字列を出力する方法」

    http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=2134392&SiteID=7

     

    に関連しているのですが、趣旨を違うので新しいスレッドを立たせていただきました。

     

      標準出力を取得するプログラムを実装していますが、見よう見まねで標準出力を取得するプログラムそのものはできていました。標準出力用に AllocConsole を使用しており、使用するとコマンドプロンプトが表示されてしまいます。現状では

     

     

        const size_t  uTitleSize = 1024 + 1 ;
        wchar_t       szTitle[ uTitleSize + 1 ] ;
        HWND          hWnd = NULL ;

     

        ::GetConsoleTitle( szTitle, 1024 ) ;

        while( hWnd == NULL )
        {
              hWnd = ::FindWindow( NULL, szTitle ) ;
        }

        while( ! ::IsWindow( hWnd ))
        {
        }

        while( ! ::IsWindowEnabled( hWnd ))
        {
        }
        Sleep( 100 ) ;

        ShowWindow( hWnd, SW_HIDE ) ;

     

     

     上記のようにスリープを入れてウィンドウが表示されていそうなタイミングで消す方法をやっています。IsWindow や IsWindowEnabled も入れていますが、デバッグなしで実行すると早すぎるのかコンソールウィンドウが消えてくれません。

     

      XP ではプロセス内で STARTUPINFO があるアドレスを指定して

     

     

       DWORD*  lpdwflags  = (DWORD*)0x00020068 ;

       WORD*   lpwshow    =  (WORD*)0x0002006c ;

     

       *lpdwflags |= STARTF_USESHOWWINDOW ;
       *lpwshow    = SW_HIDE ;

     

     

    のようにして強引に書き換えてAllocConsole を実行するとコンソールウィンドウが表示されないという方法を紹介しているページがありましたので利用していましたが、Windows Vista x64 ではダメでした。

     

      AllocConsole を非表示で実行する方法はないのでしょうか ?

      ご存じの方がいらっしゃいましたら教えてください。よろしくお願いします。

    2008年4月3日 3:04

回答

  • 子プロセスとして起動したプログラムの標準出力からのデータが得られればいいのなら、
    コンソールを割り当てる必要はないんじゃないですか?

    2008年4月3日 17:06

すべての返信

  • 下記のコードも混ぜましたら、一瞬だけ表示されますが動作としては自分の希望するものになりました。

     

        while( ! ::IsWindowVisible( hWnd ))
        {
        }

    最初から表示させない方法については引き続き調べていこうと思います。

     

    2008年4月3日 4:36
  • 子プロセスとして起動したプログラムの標準出力からのデータが得られればいいのなら、
    コンソールを割り当てる必要はないんじゃないですか?

    2008年4月3日 17:06
  • Anonymous Porgrammer さん、こんにちは。

    勉強不足で Anonymous Porgrammer さんがおっしゃっている意味がちょっと理解できません。

    自分がやろうとしてしたのは、コマンドプログラムを ShellExecute で起動したり、標準出力するする *.lib をリンクしたプログラムを書いていまして、それらが出力する文字列をエディットコントロールに出力するというものでした。

     

    見よう見まねで実装はできましたが、Vista にしたら動かなくなったので今回の質問をさていただきました。

     

    Anonymous Porgrammer さんがおっしゃっていることを調べてみます。
    ありがとうございました。

     

    p.s. いろいろと記述不足がありました。大変失礼しました。

    2008年4月7日 1:36
  • こんにちは。森田 知良です。

    みなさん、フォーラムのご利用ありがとうございます。

     

    Anonymous Porgrammerさん、有用な情報ありがとうございました。


    東雲さん、その後いかがでしょうか?

    Anonymous Porgrammerさんの情報は有用な情報と思われましたので、

    勝手ながら回答済みチェックを付けさせていただきました。
    東雲さんは、回答済みチェックを解除することもできますのでご確認ください。

    回答済みチェックが付くことにより、有用な情報を探している方が情報を見つけやすくなります。
    有効な回答があった場合は、なるべく回答済みボタンを押してチェックを付けてくださるようお願いします。

     

    また、追加の質問等ある場合は是非もう一度投稿してくださるようお願いします。

     

    それでは、これからもフォーラムのご利用をよろしくお願いいたします。

    2008年4月10日 7:11