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

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[445] 윈도우 핸들 구하기. Window Handle
chawin [chawin] 12854 읽음    2004-10-26 09:50
혹시나 하여 올립니다. 고생해서 찾은것이라 공유하고 싶어서리..





상황 : 서로 다른 프로세스인 A.exe, B.exe간에 메시지 통신을 SendMessage나 PostMessag를 통해 한쪽에 메시지 전달하기.

위와 같은 상황하에서 A가 실행 되면서 B를 실행시킨 후 B에게 메시지를 보내려고 한다.

1.A에서 B를 실행시 2가지 방법. CreateProcess, WinExec 두 가지는 마치 SendMessage와 PostMessag의 차이와 같다.

그래서 그냥 생성하라고 명령만 내리는 WinExec를 이용하는 것이 더 쉽다. CreateProcess하게 되면 조금의 시간을 대기해야 한다.



2.생성된 프로세서의 HWND찾기 : 사용 가능한 함수는 FindWindow와 FindWindowEx가 있다.

이 두함수는 사용 개념이 다르다. 결론 부터 말하면, FindWindow로 찾아야 한다. 그런데 이 함수의 맹점이 있다. 바로 두 번째 인자인

  윈도우의 타이틀 스티링이 OS의 일시적인 문제로 NULL이 나오는 경우가 있어 찾기를 못하는 경우가 종종 발생한다. 그래서 가능한

  첫째 인자인 calssname으로 찾기를....className은 쉽게 spy++로 해당 프로그램을 실행시켜놓고, 확인가능하다.

  FindWindowEx는 해당폼의 즉, B프로그램의 HWND을 FindWindow로 찾은 후에 B프로그램위에 다른 Child윈도우가 있을경우 그 Childwindow

  의 Hwnd를 구할때 사용한다. 첫째 인자에는 B프로그램의 HWND을 주고 찾으면 된다. 물론 이때도 Classname을 세번째 인자에 준다.

  만약 B의 Child윈도우의 버턴이나 다른 컨트롤이 있을경우도 같은 원리로 찾으면 된다.

 

  아래는 예제 소스임.

 

    if(WinExec(szFrmRasPath.c_str(),SW_SHOW) > 31)  //WinExec가 정상수행되면 31보다 큰값이 리턴되므로...

    {

        String strClassName, strWndName;

        strClassName = "TfrmRas";       //spy++에서 쉽게 확인가능함...

        strWndName   = "FormRas";



        HWND wHandle,whP;

        whP = FindWindow( strClassName.c_str(),NULL);   ///classname만 줘도 됨.

        //wHandle = FindWindowEx(NULL,NULL,strClassName.c_str(), strWndName.c_str() );



        gm_hwndFrmRas = whP;    ///여기서 구해진 값을 spy++로 구한값과 한번쯤은 확인 해볼것.



    }

   

    ////////////////////////////

    SendMessage구현부분.

   

    ::SendMessage(gm_hwndFrmRas,WM_COPYDATA,(WPARAM)NULL,(LPARAM)&cds);

   좀더 깊은 내용으로 SendMessage는 처리가 되지 못하면 A.exe가 멈출수 있으므로 상호 배제가 필요.     SendMessage는 생략...
구대원 [deckerd]   2004-12-02 18:51 X
그냥 RegisterWindowMessage 로 등록해놓고 쓰면 되는데
registerWindowMessage(이름)는 같은 이름에 대해서는 같은 번호를 따주기 때문에 broadcast 해도 문제 없음.  broadcast 로 postmessage 해서 받으면 될것인데 그러면 구지 window handle을 구할 필요도 없습니다.

+ -

관련 글 리스트
445 윈도우 핸들 구하기. Window Handle chawin 12854 2004/10/26
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.