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
[28295] Re:Re:Re:Re:Re:Re:다른 Application 에서 발생하는 Message box 내용을 읽어드려 Yes/No 키를 대신
라모드 [] 1095 읽음    2003-12-19 23:08
유영인님의 답글에 언제나 감사하고 있습니다. 꾸벅~~~
그런데 아직 의문점이 안풀렸어요... 밑에 그림을 보면서 설명드리죠..
MessageDlg로 MessageBox를 열면
MessageDlg("Update Record?", mtConfirmation, TMsgDlgButtons() << mbYes << mbNo, 0);
+-----------------------------------------------------------------+
| Confirm                                                       X |
+-----------------------------------------------------------------+
|                                                                 |
|  물음표            Update Record ?<--- 제가 가지고오고싶은부분  |
|                                                                 |
|                                                                 |
|           +------------+               +---------------+        |
|           |   YES      |               |    NO         |        |
|           +------------+               +---------------+        |
|                                                                 |
+-----------------------------------------------------------------+
이렇게 Messagebox 가 될텐데..
다른 Application 에서 "Confirm"이라고 쓰인부분인나 Button위에 쓰인 Yes,No
은 Findwinow,FindwindowEx해서 getwindowtext로 가져오면 되는것 같은데

제가 가져오고 싶은 부분은 "Update Record?"라고 쓰인 부분이거든요
유영인님께서 답해주신것들에는 제가 가지고 오고 싶은 부분을 어떻게 가져올 수
있는지는 없는것 같아서요 다시 질문드립니다.
(혹시 있었는데 저의 응용력 부족으로 못찾는것 일 수도..... ㅠ.ㅠ)
너무 질문 많이 드려서 송구스럽네요... 그래요 답변해 주실거죠? ^^~





유영인  Cuperido 님이 쓰신 글 :
: 아하..
: 그럴때는 WM_GETTEXT 메시지를 이용해서 작업하시면 됩니다.
:
: 소스를 찾아서 소스를 같이 첨부해 드립니다.
: 마우스를 가져다대시면 해당 폼에 메시지와 클래스가 나타납니다.
:
:
: cuperido
:
:
: //---------------------------------------------------------------------------
:
: #include <vcl.h>
: #pragma hdrstop
:
: #include "Unit_Main.h"
: //---------------------------------------------------------------------------
: #pragma package(smart_init)
: #pragma resource "*.dfm"
: TForm1 *Form1;
: //---------------------------------------------------------------------------
: __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
: {
: }
: //---------------------------------------------------------------------------
:
: void __fastcall TForm1::Timer1Timer(TObject *Sender)
: {
:
:  tagPOINT          tpPosition;
:  HWND              hdHandle, hdHandleChild;
:  int               itStringLength;
:  char              *chString;
:  char              chClass[255];
:  String            stString = "";
:
:
:  GetCursorPos(&tpPosition);
:  hdHandle      = WindowFromPoint(tpPosition);
:  hdHandleChild = ChildWindowFromPoint(hdHandle, tpPosition);
:
:  GetClassName(hdHandle, &chClass[0], sizeof(chClass));
:
:
:  if(hdHandleChild) {
:    itStringLength = SendMessage(hdHandleChild, WM_GETTEXTLENGTH, 0, 0) + 1;
:
:    if(itStringLength > 0) {
:      chString = (char *)malloc(itStringLength);
:      SendMessage(hdHandleChild, WM_GETTEXT, itStringLength, long(chString));
:      stString = chString;
:
:      free(chString);
:    }
:
:    Label1->Caption = "C";
:    Label2->Caption = chClass;
:    Memo1->Text = stString;
:   } else if(hdHandle) {
:    itStringLength = SendMessage(hdHandle, WM_GETTEXTLENGTH, 0, 0) + 1;
:
:    if(itStringLength > 0) {
:      chString = (char *)malloc(itStringLength);
:      SendMessage(hdHandle, WM_GETTEXT, itStringLength, long(chString));
:      stString = chString;
:
:      free(chString);
:    }
:
:    Label1->Caption = "P";
:    Label2->Caption = chClass;
:    Memo1->Text = stString;
:  } else {
:   Label1->Caption = "X";
:  }
:
: }
: //---------------------------------------------------------------------------
:
:
:
: 라모드 님이 쓰신 글 :
: : 답을 주셔서 너무나 감사합니다.. 근데 또 궁금한게 생겼어요..
: : SPY를 통해서 Message을 열어봤는데.. Parent안에 Child 객체를
: : 찾아보니 &yes,&no 버튼에 대한 핸들만 존제하고 내용이 표시되는
: : 부분에 대한 것은 없더라구요... 이럴 경우에는 내용이 표시되는
: : 부분을 가져온다는 것은 불가능한것인가요?
: :
: : 유영인  Cuperido 님이 쓰신 글 :
: : : 똑같은 방식으로 GetWindowText 를 사용하시면 됩니다.
: : : 다만, hdHandle 값이 그 Update Record를 찍은 메시지 값이 되겠지요.
: : :
: : : 즉.. 큰 메시지 박스가 있으면, 그 Parent 핸들이 있고.. 그 Parent안에
: : : 여러 객체가 Child로 들어갑니다.
: : :
: : : FindWindowEx 함수로, 그 Child 핸들을 찾아내셔서 그 핸들을 가지고
: : : GetWindowText를 하시면 그 메시지를 가지고 오실 수 있습니다.
: : :
: : : Child 핸들을 찾아내기 위한 클래스를 알아보시려면, Spy나 Winsight를
: : : 사용하시는 것도 좋은 방법입니다.
: : :
: : : 이전에 비슷한 답변을 예제까지 올린적 있었는데.. 못찾겠네요.. 소스도
: : : 못찾겠구.. 한번 찾아보셔서 참고해보시면 도움이 되실껍니다. ^^
: : :
: : : 설명을 좀 어렵게 드린것 같네요.. 무한 리플 환영합니다. -_-v
: : :
: : :
: : : cuperido
: : :
: : :
: : : 라모드 님이 쓰신 글 :
: : : : 아주 도움이 되었습니다. 그런데 한가지 더 궁금한게 있는데요..
: : : : 밑에 소스에서 Messagebox 의 Header를 가져오려고 할 결우
: : : : char *Temp;
: : : : GetWindowText(hdHandle,Temp,256);
: : : : 이런식으로 가져오는 것 까지는 했는데
: : : : Header 말고 내용을 가져 오려고 할려면 어떻게 해야 할까요?
: : : : 밑에 소스에서라면 "Update Record?" 요게 되겠죠?
: : : :
: : : :
: : : : //---------------------------------------------------------------------------
: : : :
: : : : #include <vcl.h>
: : : : #pragma hdrstop
: : : :
: : : : #include "Unit1.h"
: : : : //---------------------------------------------------------------------------
: : : : #pragma package(smart_init)
: : : : #pragma resource "*.dfm"
: : : : TForm1 *Form1;
: : : : //---------------------------------------------------------------------------
: : : : __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
: : : : {
: : : :
: : : : Timer1->Interval = 10;
: : : : }
: : : : //---------------------------------------------------------------------------
: : : :
: : : : void __fastcall TForm1::Button1Click(TObject *Sender)
: : : : {
: : : :
: : : : MessageDlg("Update Record?", mtConfirmation, TMsgDlgButtons() << mbYes << mbNo, 0);
: : : :
: : : : }
: : : : //---------------------------------------------------------------------------
: : : :
: : : :
: : : : void __fastcall TForm1::Timer1Timer(TObject *Sender)
: : : : {
: : : :
: : : : HWND              hdHandle = FindWindow(NULL, "Confirm"), hdButtonHandle;
: : : :
: : : :
: : : : if(hdHandle) {
: : : :    SetWindowText(hdHandle, "확인");
: : : :
: : : :    hdButtonHandle = FindWindowEx(hdHandle, NULL, NULL, "&Yes");
: : : :    if(hdButtonHandle) SetWindowText(hdButtonHandle, "예");
: : : :
: : : :    hdButtonHandle = FindWindowEx(hdHandle, NULL, NULL, "&No");
: : : :    if(hdButtonHandle) SetWindowText(hdButtonHandle, "아니오");
: : : : }
: : : :
: : : : }
: : : :
: : : : 유영인  Cuperido 님이 쓰신 글 :
: : : : : 아주아주 쉽게 하는 방법은..
: : : : :
: : : : : FindWindow로 찾으신 다음,
: : : : : 메시지나 마우스 클릭 이벤트를 보내는 방법입니다.
: : : : :
: : : : : http://www.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_qna&no=28089
: : : : : 글이 도움이 되실지 모르겠습니다.
: : : : :
: : : : :
: : : : : cuperido
: : : : :
: : : : : 라모드 님이 쓰신 글 :
: : : : : : 너무 초보적인 질문이라 부끄럽네요.. -.-;
: : : : : : 다른 Application이 돌아가며 발생하는 Message box의 내용을 읽어드려 그에 해당하는 결과(yes 또는 no 키를 누름)를 대신 응답하려고 합니다. 어떻게 해야할까요? 계시판에서 막 찾아보니 Message box 가 뜰때 발생하는 messaege를 잡아서 한다고들 하는데 전혀 Message 관련해서는 경험이 없어서 어디서 부터 손대야 할지 모르겠습니다. 
: : : : : : 또하나 키를 대신 누르는 것은 keybd_event('a',0,0,0);이렇게 하면 될것같은데.. 이건 대상이 활성화되어 있는 상태에서만 가능한것으로 알고 있는데 활성하는 다른프로그램에서 어떤방식으로 해당프로그램을 활성화시킬 수 있는지도 알고 싶습니다. 고수님들의 한마디 부탁드립니다.
: : : : : :

+ -

관련 글 리스트
28214 다른 Application 에서 발생하는 Message box 내용을 읽어드려 Yes/No 키를 대신 누르는 법?? 라모드 810 2003/12/16
28219     Re:다른 Application 에서 발생하는 Message box 내용을 읽어드려 Yes/No 키를 대신 누르는 법?? 유영인 Cuperido 1028 2003/12/16
28242         Re:Re:다른 Application 에서 발생하는 Message box 내용을 읽어드려 Yes/No 키를 대신 누르는 법?? 라모드 907 2003/12/17
28244             Re:Re:Re:다른 Application 에서 발생하는 Message box 내용을 읽어드려 Yes/No 키를 대신 누르는 법? 유영인 Cuperido 851 2003/12/17
28259                 Re:Re:Re:Re:다른 Application 에서 발생하는 Message box 내용을 읽어드려 Yes/No 키를 대신 누르는 라모드 879 2003/12/18
28261                     Re:Re:Re:Re:Re:다른 Application 에서 발생하는 Message box 내용을 읽어드려 Yes/No 키를 대신 누르 유영인 Cuperido 1028 2003/12/18
28295                         Re:Re:Re:Re:Re:Re:다른 Application 에서 발생하는 Message box 내용을 읽어드려 Yes/No 키를 대신 라모드 1095 2003/12/19
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.