2017-09-12 17 views
1

Qtアプリケーションのボタンをクリックすると、プロセスを開始したいと考えています。 QProcess::startDetached(..., qint64 * pid)http://doc.qt.io/qt-5/qprocess.html#startDetached)でプロセスを作成しましたが、私は隠したいコンソールがあります。PIDを指定してプロセスのコンソールを隠すには?

どのように非表示にするには?どの機能をプロセス外で使用する必要がありますか?

このコードは(Win32では)私のプロセスのコンソールを隠さない:

if (AttachConsole((DWORD)m_PID)) 
{ 
    FreeConsole(); 
} 

答えて

0

あなたが起動しているプログラムを再コンパイルすることができた場合、あなたはそれMSVCでWindowsのではなく、コンソールプログラム(になるかもしれませんこれはプロジェクトのリンカー - >システムにあり、設定は/SUBSYSTEM:WINDOWSです)。

またQT startメソッドはコンソールウィンドウを作成することはありませんが、startDetachedは使用するため、startを使用する可能性があります。


あるいはCreateProcessためCREATE_NO_WINDOWフラグは自動コンソールを防止する、引用MSDN:

プロセスは、コンソールウィンドウなしで実行されているコンソールアプリケーションです。したがって、アプリケーションのコンソールハンドルは設定されていません。

は、残念ながらそれはQTように見えない作成したり、それはいくつかの年前と拒否された提案だったallthough、(例えばなしQProcess process(CreateProcess(...)))ネイティブ旗またはネイティブハンドルからそのQProcessを使用する方法を提供します。 QProcess: Make it possible to set native process creating flags

Microsoft APIを使用するか、マルチプロセス作業用に別のライブラリを探すだけです。

+0

'CREATE_NO_WINDOW'は、' STARTUPINFO'を使って隠しコンソールウィンドウを作成する代わりに使用できます。新しいコンソール(つまり、conhost.exeのインスタンス)が作成され、プロセスの標準ハンドルがコンソールの入力バッファとスクリーンバッファに設定され、プロセスのコンソールハンドルが新しいコンソールを参照するため、コンソール機能が正常に動作します。コンソールがウィンドウを作成しないので、 'GetConsoleWindow'は' NULL'を返します。このフラグは、 'CREATE_NEW_CONSOLE'と' CreateProcessWithLogonW'や 'CreateProcessWithTokenW'のように後者を暗黙的に使用する関数では無視されます。 – eryksun

+0

それはどこに直接書かれていますか?ただし、GUIプロセスの場合、最初に 'ShowWindow'が呼び出され、' nCmdShow'パラメータは無視されます。 'wShowWindow'はデフォルト値を指定しますが、「コンソールプロセスの場合は、プロセスの新しいコンソールが作成された場合、その情報はコンソールウィンドウに影響します。 idはそれがコンソールホストに渡され、そのわずかに異なる振る舞いでよく定義されていると推測します。 –

+0

'STARTUPINFO'の使用は、子プロセスが新しいコンソールを作成する場合、つまり' CREATE_NEW_CONSOLE'と組み合わされている場合には常に有効です。ウィンドウは隠されているので、アプリケーションはハンドルを取得して表示できます。 'CREATE_NO_WINDOW'アプローチは暗黙的に新しいコンソールを作成し、これまでに表示できるウィンドウはありません。ドキュメンテーションに関しては、私は "[t]のようなものを言っているアプリケーションからコンソールのハンドルが設定されていない"という誤った記述や非常にひどく記述されたことがどれほど意味があるか分かりません。 – eryksun

関連する問題