2017-09-12 9 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에 (그것을 윈도우가 아닌 콘솔 프로그램을 만들 수도 있습니다 이것은 프로젝트 링커 -> 시스템, 설정, /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