C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[62668] Re:Re:CreateProcessA로 생성한 프로세스의 제목표시줄을 안보이게 할수 있나요?
장성호 [nasilso] 1638 읽음    2010-10-13 18:28
C++Builder로 만든 프로그램이  잘 안되는 이유는?

델파이나 빌더로 만든 어플의 메인폼(MainForm)의 핸들이
작업표시줄(TaskBar)에 나타나는 버튼의 window가 대부분 아니기 때문입니다.

빌더로 만든 어플은 작업표시줄에 나타나는 window는
Application->Handle 에 해당되는 window입니다.

그래서 FindWindow로  MainForm을 찾아서 그놈에 해당하는 작업표시줄 버튼을 찾으면 없을수 있는게지요

FindWindow로 MainForm을 찾은다음에
메인폼의 WndParent를 구해보니다.

GetWindowLong(Wnd, GWL_HWNDPARENT))

위에서 구한놈이 Desktop이면 MainForm이 현재 작업표시줄에 나타나있는 상태이구요
DeskTop이 아니라면 Application->Handle 일것입니다.(대부분의 경우)

MainForm을 비롯하여 TCustomForm을 상속받은 모든 폼은 기본적으로
wndParent를 Application->Handle로 설정해서 CreateWindow하거든요...


결론적으로 Application->Handle 을 찾아서 hide시켜주면 된다.. 뭐 그런 얘기입니다.

RAD2007부터인가.. MainForm이 작업표시줄에 바로 나타나게도 할수 있도록 vcl에서 지원해주고 있습니다.

그 이전버젼은 프로그래머가 여러가지 꼼수를 써야하구요..

그럼...




박영목.월천 님이 쓰신 글 :
: 요즘 또 회사 가고 싶습니다. 노는 것도 지루하군요... ㅋㅋㅋ
:
: 역시 코딩은 중독성이 있습니다. 코딩이 아니고 파헤치는 것? 인가?
:
: 그래서 몇 군데 입사원서를 넣어 보니...  연락도 안옵니다....
:
: 프로그램은 그럭저럭 하는 데.....  ㅋㅋㅋ,  부산이라  한국이라 그런가? 봅니다.
:
: 이렇게 해서 우리나라 개발자들 60까지 개발하겠습니까?   미래가 암울하군요...  ㅋㅋㅋ
:
: 현재 회사 팀장님들 나이먹은 프로그래머들 좀 뽑으세요...  당신도 곳 연락오지 않게 됩니다.
: 나이드신 프로그램 선배님들... 회사 가면 팀장님 시키는 대로 일만 하십시오.... 댓구하지 말고 이렇게 하면
: 더 좋은 데... 쫑알쫑알...  잔소리 많은 시어머니 누가 모실려고 합니까? ㅋㅋㅋ
:
: 이렇게 되면 좋아하는 프로그램 60까지 할 수 있지 않을까?   아 ~~  사장이 되어 그렇게 할 수 있겠군요... ㅋㅋㅋ
:
: 그런데 사장은 재미가 없잖아~~~~~
:
: --------------------------------------------------------------------------------------------
:
: 이것도 재미있겠다 싶어 검색을 좀 했습니다. 검색을 하고 연구하시면 될 듯한데....
:
: 찾긴 찾았는 데... 옛날에 TASKBAR 숨기고 장난할 프로그램이 있어서... 말입니다.
:
: XP에서 되기는 됩니다. 다른 데는 모르겠고...
:
: 개발툴은 C++Builder 6.0 인데.... 
:
: 계산기, 메모장, 이런 것 잘 됩니다.  MFC로 만들어져서 그런가?  여기까지는 모르겠고요...
:
: C++Builder로 만든 놈은 사라지지 않네요...  대단해 C++Builder ㅋㅋㅋ
:
: 스쳐가는 생각에 C++Builder를 만들 때 안에 어딘가 무엇을 더 추가하면 되지 안을까? 생각이 떠오르는 데...
:
: 소스가 있다면 이렇게 복잡하게 숨기려고 하지 않을 실 것이고...  그리고 숨기고자 하는 프로그램이....
:
: 현재로서는  C++Builder로 만들어진 것이 아니야 한다는 것... Delphi도 안될 수 있겠네요... 혹 버전이 다르면 될지도..
:
: 더 연구하는 것은 또 피를 흘리는 고통이 따르니까?  알아서 하시고... 저는 간단한 것만....
:
: 도움이 되었으면 합니다.....  참고하세요...
:
: 계산기 프로그램 하나 띄워두고 TEST하시면 됩니다. XP에서 다른 곳에서도 해보셔도 되고... 장담은 못함...
: 여기에 대한 답변은 여기까지 하겠습니다. 질문을 혹 하시면 다른 고수님이 답변 부탁드립니다.
: 저는 초보이기 때문에 힘듭니다. 이것도 찾아서 한 것이라.... ㅋㅋㅋ   그럼
:
:
: //---------------------------------------------------------------------------
: #define NO_WIN32_LEAN_AND_MEAN       //소스파일 제일 위에 을 넣어주세요.
: 
: #include 
: #include 
: #include 
: #include 
: #pragma hdrstop
: 
: #include "Unit1.h"
: //---------------------------------------------------------------------------
: #pragma package(smart_init)
: #pragma resource "*.dfm"
: TForm1 *Form1;
: 
: ITaskbarList *pTaskbar;  //이런 저도 급하게 TEST하다고 여기다가??.. 초보님들 저 따라 하지 마세요
: //---------------------------------------------------------------------------
: __fastcall TForm1::TForm1(TComponent* Owner)
:         : TForm(Owner)
: {
: }
: //---------------------------------------------------------------------------
: 
: void __fastcall TForm1::Button1Click(TObject *Sender)
: {
: 
: 
:   //pTaskbar->HrInit(); //DeleteTab(this);  // HrInit(this);
: }
: //---------------------------------------------------------------------------
: void __fastcall TForm1::HideCalcClick(TObject *Sender)
: {
:   hwnd = ::FindWindow( "SciCalc", "계산기" );
: 
:   CoInitialize(NULL);
:   //We call below function since we only need to create one object
:   CoCreateInstance(CLSID_TaskbarList,0,CLSCTX_INPROC_SERVER,IID_ITaskbarList,(void**)&pTaskbar);
: 
:   HRESULT ret = pTaskbar->DeleteTab( (HWND)hwnd );
: 
:   //if( ret==S_OK ) ShowMessage( "OK" );
: 
:   ::ShowWindow( (HWND)hwnd, SW_HIDE );
: }
: //---------------------------------------------------------------------------
: void __fastcall TForm1::ShowCalcClick(TObject *Sender)
: {
:   ::ShowWindow( (HWND)hwnd, SW_SHOW );
: }
: //---------------------------------------------------------------------------
: 
: 

:
:
:
:
:
:
:
:
:
: Task
:
: 30억 님이 쓰신 글 :
: : STARTUPINFO si ;
: :         memset ( &si, 0, sizeof ( STARTUPINFO ) ) ;
: :         si.cb = sizeof ( STARTUPINFO ) ;
: :         si.dwFlags = STARTF_USESTDHANDLES ;
: :         si.wShowWindow = SW_HIDE;
: :
: :         PROCESS_INFORMATION pi ;
: :
: :         flag = CreateProcessA ( NULL, comLine.c_str ( ), NULL, NULL, true, DETACHED_PROCESS, NULL, processDir.c_str ( ), &si, &pi ) ;
: :
: :         if  ( ! flag )
: :             {
: :
: :             return false ;
: :
: :             }
: :
: :         HWND hWnd = NULL ;
: :         TRect rc ;
: :         WaitForInputIdle ( pi.hProcess, INFINITE ) ;
: :
: :         for ( int index = 0 ; index < 100 ; index ++ )
: :             {
: :
: :             hWnd = FindWindow ( NULL, "XXX" ) ;
: :             if ( hWnd != NULL )
: :                 {
: :
: :                 ShowWindow ( hWnd, 0 ) ;
: :                 break ;
: :
: :                 }
: :
: :             }
: :
: :         DWORD Ret = WaitForSingleObject ( pi.hProcess, waitMilSec ) ;
: :
: : 다음과 같이 프로세스를 생성하는데 윈도우 창이 안보이게는 했는데 제목표시줄도 안보이게 할수 있는지
: : 궁금합니다.
: :
: : 고수님들의 조언 부탁드립니다.

+ -

관련 글 리스트
62658 CreateProcessA로 생성한 프로세스의 제목표시줄을 안보이게 할수 있나요? 30억 1668 2010/10/13
62666     Re:CreateProcessA로 생성한 프로세스의 제목표시줄을 안보이게 할수 있나요? 박영목.월천 1230 2010/10/13
62668         Re:Re:CreateProcessA로 생성한 프로세스의 제목표시줄을 안보이게 할수 있나요? 장성호 1638 2010/10/13
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.