2017年11月
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    
無料ブログはココログ

« .NETオブジェクトのオーバロードされたメソッドのサフィックスを調べる。 | トップページ | ウィンドウアプリから非表示のコンソールウィンドウを開く。(その2) »

2008年9月14日 (日)

ウィンドウアプリから非表示のコンソールウィンドウを開く。

ウィンドウアプリでAllocConsole()すると、コンソールウィンドウが開きます。
このコンソールウィンドウを非表示にできないでしょうか?

一度、表示してから非表示にしてよいなら、

ShowWindow(GetConsoleWindow(),SW_HIDE)

で、できますが、最初から非表示にできない?

もし、ウィンドウアプリを非表示で起動していればそうなりますが。。。

ウィンドウアプリからCMD.EXEを非表示で起動して、そのコンソールウィンドウをAttachConsole()することで代替できます。

ポイントは、
非表示の指定方法(SW_HIDE or CREATE_NO_WINDOW)
AttachConsole()のタイミングの取り方(WaitForInputIdle代替 or StandardOutput.ReadLine)
CMD.EXEの終了のさせ方(WriteConsoleInput or StandardInput.Close)
の3つです。

まず、一瞬コンソールが表示されるサンプルから。

vbc /t:winexe sample1.vb

Imports System.Threading

Public Class Class1

Private Declare Function AllocConsole Lib "kernel32" () As Integer
Private Declare Function GetConsoleWindow Lib "kernel32" () As Integer
Private Declare Function ShowWindow Lib "user32" (ByVal hWnd As Integer, ByVal nCmdShow As Short) As Integer

Private Const SW_HIDE As Short = 0s
Private Const SW_SHOW As Short = 5s

Public Shared Sub Main()
AllocConsole()
Dim hwnd As Integer = GetConsoleWindow()
ShowWindow(hwnd, SW_HIDE)
Thread.Sleep(5000)
ShowWindow(hwnd, SW_SHOW)
Thread.Sleep(5000)
End Sub
End Class

« .NETオブジェクトのオーバロードされたメソッドのサフィックスを調べる。 | トップページ | ウィンドウアプリから非表示のコンソールウィンドウを開く。(その2) »