실행된 프로그램의 특정 버튼을 누르게

Posted by 겨울에
2011. 9. 26. 09:08 scrap/ C/C++

[출처 : 데브피아 http://www.devpia.com/Forum/BoardView.aspx?no=15684&ref=15684&page=1&forumname=MOBILE_QA&stype=&KeyW=%b9%f6%c6%b0+%c5%ac%b8%af+%b8%de%bc%bc%c1%f6&KeyR=titlecontent ]

 

실행된 프로그램의 특정 버튼을 눌르게 법은 ??

 

안녕하세요.

얼마전에 실행파일의 특정 버튼 클릭에 대해서 질문을 했었는데, 결국 해결하지는 못했습니다.

몇일 삽질 끝에 데브님들의 도움을 받고자 이렇게 몇자 끄적입니다.

제가 실행하고 싶은 프로그램은 공개버전인 SJphone입니다.

여기 보면 통화마크 버튼과 통화끈기 버튼 2개가 있는데, 이 버튼에 대한 이벤트 처리입니다.

인스톨버젼은 올려두겠고요.

제가 테스트한 소스는

 

void CTESTDlg::OnBtn1()

{

    // TODO: Add your control notification handler code here

    

    HWND hSjPhone = ::FindWindow(L"Dialog", L"sjphone");            // <--- sjphone 헨들 검사

      if(hSjPhone == NULL)                                                           // <--- sjphone이 떠있지 않다면..

    {

        SHELLEXECUTEINFO shellInfo;

        memset( &shellInfo, 0, sizeof(SHELLEXECUTEINFO ));

        shellInfo.cbSize= sizeof(SHELLEXECUTEINFO);

        shellInfo.fMask = SEE_MASK_NOCLOSEPROCESS;

        shellInfo.hwnd = hWnd;

        shellInfo.lpVerb = L"Open";

        shellInfo.nShow = SW_SHOW;

        shellInfo.lpFile = L"\\program files\\sjphone\\sjphone.exe";

        ShellExecuteEx(&shellInfo);

        Sleep(1000);

        SipFindExe(hWnd, pwText);

        return;

    }

    ::ShowWindow(hSjPhone, SW_SHOW);                   

    ::SetForegroundWindow(hSjPhone);

 

                                                                                                   //<----------- 이곳에서부터 의문..

    HWND hTemp = ::GetNextDlgTabItem(hSjPhone, NULL, FALSE);      //   <----- TAB Order값을 가져옴

 

    WCHAR wszClassName[255] = {0};

    int nCompare = 1;

    for(int nCount = 0; hTemp != NULL; nCount++)

    {

        GetClassName(hTemp, wszClassName, 255);

        nCompare = wcscmp(wszClassName, L"Button");

        if(nCompare == 0)

        {

            break;

        }

        else

        {

            hTemp = ::GetNextDlgTabItem(hSjPhone, hTemp, FALSE);

        }

    }

 

    ::SendMessage(hTemp, WM_LBUTTONDOWN, NULL, (LPARAM)pwText);

 

}

 

 

소스를 보시면 아시겠지만, sjphone의 클래스헨들값을 가져와서 비교한후 WM_LBUTTONDOWN 메세지로 클릭이

되게 하였습니다.

spy++로 다이얼로그를 보니 Button이 무지많더군요. ㅡㅡ;

제가 원하는 것은 통화 버튼과 통화 끈기 버튼인데, 우선 버튼 클릭이라도 성공하고자 위와같이 처리했습니다.

저리하면 어떤 버튼이 될지는 모르겠지만 하나는 눌리까 햇는데, 버튼 자체를 찾지 못하더군요.

디버깅을 해보니 SJphone 헬들을 가져와서 GetclassName 비교하느곳을 보니 WCE_edit, ListSystem32 이것만

계속 가져옵니다.

 

sjphone의 통화버튼, 통화끈기 버튼 둘중에 하나라도 눌리게좀 수정좀 해주세요ㅜㅜ

부탁드립니다.

 

 

Re: ...

 

 ::SendMessage(hTemp, WM_LBUTTONDOWN, NULL, (LPARAM)pwText);

 

이부분을 이렇게 바꿔보시는건 어떨까요?

 

::PostMessage(hTemp, WM_KEYDOWN, (WPARAM)VK_RETURN, (LPARAM)0);

::PostMessage(hTemp, WM_KEYUP, (WPARAM)VK_RETURN, (LPARAM)0);

 

그럼 성공하시길...