소스 코드 올립니다..

개학하면 바뻐서 업데이트 할 시간이 자주 없을듯 하네요..--;;

4학년 되면 취업준비한다고 바쁠테고.. 암튼 소스코드 올립니다. 언젠가는 더이상 업데이트 못 할날이 올지도 모르기 때문에..

솔직히 업데이트 하는게 기본적인틀이 잡혀 있어 어렵지는 않은데 약간은 귀찮네요..--;; 버그들도 많이 있는데.. 솔직히 손데면 일이 커질지도 모르고.. 귀찮고 해서요..

  • 2007.09.15 01:13

    어떻게 하는건지 잘 모르겠지만 저보다 어리신거 같은데 멋지네요..부러워요...;;;

  • 송길식 2007.10.23 16:35

    감사합니다. 단비 같은 분이시네요.

  • 대식 2007.07.30 00:29

    제 컴퓨터가 xp pro 영문판인데 안되어 찾다가 보니까..

    코드를 아래와 같이 수정하니까 되네요..

    제가 수정한 부분은 MelonSniperMacro.cpp에서

    Ln 308쯤에

    //영문판 윈도우를 위한 코드
    if(wOpenButton== NULL)
    {
    wOpenButton = CWnd::FindWindowEx(wOpen->m_hWnd,NULL, TEXT("Button"), TEXT("Open(&O)"));
    if(wOpenButton == NULL) // 영문판 Windows XP 를 위한 코드.
    wOpenButton = CWnd::FindWindowEx(wOpen->m_hWnd,NULL, TEXT("Button"), TEXT("&Open"));
    }

    더 좋기로는 운영체제 판단해서 처리해야 겠지만 .. 귀찮아서..

    코드 공개해 주시니 편하군요..

    감사합니다.

  • 소스 2007.08.07 13:19

    소스 이거 어디다 까는건가요?

  • ms 2007.07.18 21:41

    왜 저는 다운 받고 압축풀었는데 안되죠?.ㅠㅠ
    어떻게 실행해야하는지 모르겠어요..ㅠㅠ

    • 영재 2007.07.21 09:46

      이 파일 소스파일입니다. 컴파일 해야 수행할수 있습니다. 다운로드 카테고리에 있는 파일을 다운받아 보세요..

  • 고마워여 2007.07.24 12:40

    영재님 저기 컴파일랑 카테고리 어딧? 찾아 는지 모르겠어여
    도와주새요. 부탁합니다. 전 홈피가 tjqhrry@empal.com 이메일입니다. 영재님 재가 처음에요. mp3말 입니다. 영재님 제발 부탁합니다.
    지금 보시면 저 홈피 보내주새요. 컴파일랑 카테고리 잘 모르겠어요

    • 영재 2007.07.28 09:19

      왼쪽 메뉴에서 다운로드를 클릭하시면 다운로드 페이지가 뜹니다..

  • 굼벵이 2007.07.25 17:26

    아. 다시 올리셨네요...^^;
    이번에는 첫곡만 컨버팅 되고 나머지 곡은 안돼네요..
    그래서 수정을 조금 했습니다.
    2군데 수정 했는데요..

    1. bool CMelOnSniperMacro::clickGoImage(void)
    에서
    CWnd* wIE;
    이렇게 해 두셔서.. 핸들을 못찾는 경우 초기화 에러가 납니다.(Debug시에...^^) 그래서..
    CWnd* wIE = NULL;
    이렇게 초기화를 해주셔야 합니다.
    .Net의 경우 예전의 C++과 달리 초기화가 엄청 까탈스러워 졌지요..

    2. UINT macroThread( LPVOID pParam )
    에서요.. (스레드 함수에서)
    cmm->commandDCFConverting();
    이걸 해주시고 for문으로 들어가시는데요...
    저도 유료사용자(가입하고 쿠폰으로 등록된.. 유료 맞죠??^^)라서..
    유료사용자가 아니신 분들은 어떤 화면이 나오는지 모르겠는데..
    DCF컨버팅 화면이 case 6번까지 진행되면 없어져 버립니다.
    즉.. DCF컨버팅 화면이 다시 뜨는 기능이 for문 내에 없어서...

    bool CMelOnSniperMacro::clickGoImage(void)
    {
    ...
    wDCFConverting = findWindow(TEXT("#32770"), _T(""), 530,455);
    if(wDCFConverting != NULL) return true; // 이 부분을 타지 않습니다.
    ...
    }

    그러니.. 아래쪽에서 윈도우 핸들 못찾고 50회 while문 돌다가 나와버립니다. 진행 안되요..^^;

    그래서.. 저는...

    case 6:
    //[DCF 컨버팅] 성공 확인창 확인 버튼 누르기
    scss= cmm->clickSucessOK();
    ::Sleep(SLEEP_STEP);

    if(scss){
    cmm->setStep(END);

    //굼벵이수정
    cmm->commandDCFConverting();
    ::Sleep(SLEEP_STEP);
    이렇게 바꾸었습니다.
    모두 처리된 뒤에 DCF컨버팅 화면이 하나 덩하니뜨기는 하는데...
    지금 시간이 없는 관계로 대강...^^;
    깔끔하게 수정해 주세요...

    좋은 프로그램 만들어 주셔서 감사 합니다..
    행복하세요~~~

    • 영재 2007.07.28 09:21

      와 많이 신경쓰주시니 감사하군요~~

      바로 수정해봐야 겠군요..

  • Rms 2007.07.26 18:49

    우와 멋있다
    mc sniper 노래처럼 ^^

  • 굼벵이 2007.07.30 14:15

    오히려 내가 쓸라고 수정을 한거지요..
    엄청 잘 쓰고 있습니다...^^;
    좋은 아이디어로 이정도까지 만들어 두셔서 지금 잘쓰고 있네요..^^;
    앞으로도 좋은 프로그램 많이 만드세요..^^;
    그럼.. 총총...

  • 카즈 2008.09.26 11:23

    흠 이상현상이랄까요 너무 빠르게 열고 닫다가 2개가 중복해서 열려버리면서 파일추가가 안될때가 있습니다 타이머를 줘서 좀 늦추는게 좋지 않을까요
    0.8초마다 한벙정도로

김정민님이 어떻게 윈도우를 찾느냐고 물어보셔서~~ 작성합니다.. 많은 도움이 되었으면 좋겠네요..

CMelOnSniperMacro는 매크로를 수행하는 클래스입니다.

이 클래스의 맴버변수로는 변환해야할 파일들 현재 몇번째 파일 변환중인지.. 몇번째 스텝인지 등을 저장하는 변수들이 있습니다.

다이어로그 클래스에서 실제 이 Macro클래스 인스턴스가 만들어집니다.. 타이머에 의해 m_DoMacro맴버 함수가 정해진 시간에 호출 됩니다. 맴버 변수가 가지고 있는 현재 상태를 가지고 매크로를 수행하는 부분입니다.

그 중 윈도우창을 찾는 부분의 소스들입니다. 중복되는것은 생략했습니다.
 

bool CMelOnSniperMacro::m_FindMainWindow(void)
{
 m_wndMelon.m_hWnd = ::FindWindow(TEXT("MelOnFrameV30"),NULL);
 if(m_wndMelon.m_hWnd == false) return false;
 return true;
}

::FindWindow(TEXT("MelOnFrameV30"),NULL); 이 함수는
첫번째 인자로 윈도우의 클래스 이름
두번째 인자는 캡션 이름
으로 윈도우를 찾고 핸들을 반환합니다.. 최상위 윈도우를 찾을 수 있습니다. NULL을 입력 할 수 있습니다.

m_wndMelonCWnd타입입니다.

만약 윈도우 내부에 있는 자식 윈도우를 찾고자 하거나 특정 윈도우 다음에 위치한 윈도우를 얻고자 할때 는
FindWindowEx(HWND, HWND, LPCWSTR, LPCWSTR);함수를 사용하시면 됩니다..
첫번째 인자는 부모 윈도우의 핸들
두번째 인자는 인자 윈도우에 다음에 위치하는 윈도우 핸들을 얻어 옵니다.
세번째 인자는 클래스명
네번쨰 인자는 캡션 명입니다..

물론 NULL값을 인자로 넘겨 줄 수 있습니다.

int CMelOnSniperMacro::m_DoMacro()
{
 
 switch(m_nStep)
 {
  case 2://찾아보기창 띄우기
  //컨버팅 변환창에서 파일 찾기 버튼 누르기
  {
   CWnd* wndDCFConverting =m_findWindow(TEXT("#32770"), _T(""), 530,455);
   if(wndDCFConverting->m_hWnd != NULL){
    wndDCFConverting->PostMessage(WM_COMMAND,0x836,0x0);
    m_nStep++;
   }
   delete(wndDCFConverting);
  }
  break;
 }
 return 0;
}

그러나 멜론 3.0으로 업데이트 되면서 대부분의 윈도우에 캡션이 없습니다. 특이 윈도우 디자인에 이미지가 많은 경우 대부분 FindWindow로 한번에 찾기 어렵습니다..

또한 클래스명 또한 다이얼로그 박스에 기본값인 #32770입니다. 따라서 같은 클래스명과 이름의 윈도우가 수개 내지 수십개가 됩니다.

그래서 윈도우를 구별하기위해 윈도우 크기를 가지고 윈도우를 찾는 함수 m_findWindow라는 함수를 구현 했습니다... 물론 이 방법은 윈도우크기가 고정되어 바꿀 수 없는 윈도우에 한해서 쓰일 수 있는 방법입니다.. 윈도우 크기가 바뀔수 있는 경우라면 또 다른 방법을 생각 해봐야겠죠..

CWnd* wndDCFConverting =m_findWindow(TEXT("#32770"), _T(""), 530,455);

윈도우를 받아 옵니다.

    wndDCFConverting->PostMessage(WM_COMMAND,0x836,0x0);

혹시 윈도우를 찾지 못할 수도 있으므로 if문을 사용 찾은 경우에만 원하는 메세지를 찾은 창에 보냅니다. 위 다른 윈도우에 명령을 보내는 방법은 PostMessageSendMessage함수 가 있습니다.

PostMessage는 비동기로 메세지를 보내고 SendMessage는 동기로 메세지를 보냅니다..

이 함수의 인자, Msg와 wParam, lParam의 값은 Spy++이나 별도의 유틸을 통해서 쉽게 얻을 수 있습니다. WM_COMMAND, 0x836, 0x0은 멜론 스나이퍼에서 [파일찾기] 버튼을 눌러주는 역활을 합니다.

아래가 윈도우의 크기로 창을 얻어오는 함수의 실제 구현입니다.

CWnd* CMelOnSniperMacro::m_findWindow( CString strClass, CString strWindow, int height, int width)
{
 CWnd* findWindow = new CWnd();
 
 do{  
  findWindow->m_hWnd = ::FindWindowEx(NULL,findWindow->m_hWnd,strClass, strWindow);
  RECT r;
  //창의 크기로 윈도우 판별함
  findWindow->GetWindowRect(&r);
  int thisHeight = r.bottom-r.top;
  int thisWidth = r.right - r.left;
  if(thisHeight == height && thisWidth==width){
   return findWindow;
  }

 }while(findWindow->m_hWnd != NULL);

 findWindow->m_hWnd = NULL;
 return findWindow;
}


findWindow->m_hWnd = ::FindWindowEx(NULL,findWindow->m_hWnd,strClass, strWindow);
우선 가장 처음 do{}while()반복무을 수행할 경우 findWindow->m_hWndNULL입니다.. 따라서 해당 클래스이름과 윈도우명을 가진 첫번째 윈도우를 찾습니다..

그 다음 윈도우크기를 비교해 크기까지 동일하면 우리가 찾으려 했던 윈도우이므로~~ 해당 윈도우를 반환하고..

만약 윈도우 크기가 다르면 다음 윈도우를 찾아야합니다.

do{}while()반복문이 처음이 두번째 수행되는 것이라면  findWindow->m_hWnd가 이전에 찾았던 윈도우입니다.

FindWindowEx에서 두번째 인자가 이 다음 윈도우를 찾아라 하는 인자입니다.. 그럼으로 두번째 해당윈도우 클래스명과 이름을 가지는 두번째 윈도우를 찾게 되는 것입니다.
findWindow->m_hWnd = ::FindWindowEx(NULL,findWindow->m_hWnd,strClass, strWindow);

계속 해서 찾다가 더이상 다음 윈도우가 없을경우~~ null을 반환하고 while()문을 빠져 나오게 됩니다..
  • 김정민 2007.05.05 19:11

    혹시나 하여 부탁드렸는데
    자세한 설명까지 곁들여 주셔서
    너무 감사합니다.
    항상 건승 하십시요.

  • 진대용 2009.05.24 12:43

    안녕하세요 좋은 글이네요 감사합니다~