, , ,

이 글은 윈도우XP기준입니다.
다른 운영체제에서는 해당 API가 작동하지 않거나 다른 동작을 할수 있습니다.


제가 올린 대부분의 예제는 유니코드를 기준으로 함니다.
(프로젝트 속성 -> 구성 속성 -> 일반 -> 문자 집합 -> 유니코드 문자 집합 사용)

API연습하기 참 좋은 소재가 메모장이죠 ㅎㅎㅎ
만만한게 메모장(으잌!)


 
1.메모짱 어디있니~
메모장을 찾아 글을 출력해보겠습니다.


 
1-1.적당한 곳에  변수 선언


//메모장의 핸들 저장용 
HWND hwndNotepad;
 
//차일드 핸들 저장용
HWND hwndNotepadChild;

//이 문자열을 출력한다.
LPCTSTR  strText = L"메모짱 하악하악 (ㅡ.ㅡ;;;)";


 
1-2. 적당한 곳에 출력 코드 입력

//메모장 핸들을 찾는다. 
hwndNotepad = FindWindow(L"Notepad", NULL);
 
//메모장안에있는 에디트박스 핸들을 찾는다. 
hwndNotepadChild = FindWindowEx(hwndNotepad, NULL, L"edit", NULL);

//메모장에 문자열 입력! 
SendMessage(hwndNotepadChild, WM_SETTEXT, 0, (LPARAM)strText);


 
1-3.적당한 메모장을 연다.
메모장을 열어 둔다.


 
1-4.빌드후 실행



우와~
실행 된다!
입력 된다!
우왕ㅋ굳

그런데 이 예제에는 2가지 문제점이 있습니다.
여러 메모장을 연경우 맨마지막에 연 메모장에 입력이 된다는 것과 기존글을 지워버린다는 것이조.


 
2.나의 메모짱은 이거라능

활성화된 메모장에 글을 올려 봅시다.


 
2-1. 코드변경



//메모장 핸들을 찾는다.
//hwndNotepad = FindWindow(L"Notepad", NULL);

//활성화 된 창의 핸들을 가저온다.
hwndNotepad = GetForegroundWindow();



 
2-2.빌드후 실행
실행버튼을 누르고 잽사게 메모장을 활성화 시켜야 합니다.
안그러면 작동 안합니다 ㅡ,.ㅡ;

"메모짱 하악하악" 이라고 적혀있는 메모장이 제일 마지막에 켠 메모장입니다.


 
3.메모짱은 지워지지 말라능ㅡㅜ
이제 기존에 있던 내용을 유지한테 원하는 문자열을 넣어 봅시다.
이미 적혀있는 파일과 달리 아직 저장되지 않은 메모장 내용을 처리하다 보니 파일로 읽어들일수는 없다는 사실은 이미 알고 있을 것입니다.
아직 저장되지 않은 데이터를 읽어오는건 쵸큼 번거로운 작업입니다.
그래서 풀소스로 다시 올려 주겠다능 하악하악


 
3-1.적당한 곳에 변수선언

 //메모장의 핸들 저장용
 HWND hwndNotepad;
 //차일드 핸들 저장용
 HWND hwndNotepadChild;
 
 //이 문자열을 출력한다.
 LPCTSTR  strText = L"메모짱~메모짱~";
 
 //메모장에 있는 내용을 받아오기위한 변수
 TCHAR *strNotepadText;
 //최종적으로 들어갈 메모장 내용
 TCHAR *strTotalText;
 
 //문자열의 길이를 임시로 저장해둘 변수
 int intTempLen;



변수가 많이 추가 됬습니다 ㅡ,.ㅡ;;
하지만 설명은 주석에 있는게 다입니다 ㅎㅎ


 
3-2. 적당한 곳에 출력 코드 입력

  //메모장 핸들을 찾는다.
  hwndNotepad = FindWindow(L"Notepad", NULL);
 
  //활성화 된 창의 핸들을 가저온다.
  //hwndNotepad = GetForegroundWindow();
 
  //메모장안에있는 에디트박스 핸들을 찾는다.
  hwndNotepadChild = FindWindowEx(hwndNotepad, NULL, L"edit", NULL);
 

  //메모장의 문자열을 가저온다.
 
  //메모장 내용의 길이를 받아온다.
  intTempLen = SendMessage(hwndNotepadChild, WM_GETTEXTLENGTH, 0, 0);
  //메모장 내용의 길이 만큼 변수길이를 조정한다.
  strNotepadText = new TCHAR[intTempLen];
  //메모장 내용을 받아온다.
  SendMessage(hwndNotepadChild, WM_GETTEXT, intTempLen + 1, (LPARAM)strNotepadText);
 

  //메모장 내용의 길이 + 내가 넣을 내용의 길이
  intTempLen = intTempLen + wcslen( strText);
  //최종적으로 들어갈 메모장의 내용 길이 설정
  strTotalText = new TCHAR[intTempLen];
 
  //파이널 퓨전!!!!!!
  wsprintf(strTotalText, L"%s%s",  (LPCTSTR)strNotepadText, strText);
  
  //메모장에 문자열 입력!
  SendMessage(hwndNotepadChild, WM_SETTEXT, 0, (LPARAM)strTotalText);



일단 챕터2에서 추가된 코드는 주석 처리헸습니다.(테스트할때 귀찬아서 ㅡ.-;)
메모장 내용의 가변성을 염두해두고 코드를 만든 것이기때문에 조금 복잡해 보이긴 하지만 친절한 주석씨(?) 덕분에 힘들지 않을 거라 생각합니다.



 

p.s. 오덕체로 설명하니 색다른데? ㅎㅎㅎ
p.s. 나 오덕 아니라능




  1. Favicon of http://boycrow.tistory.com BlogIcon 까마귀 소년 2011.12.30 02:50 신고  Address  Edit/Delete  Reply

    윈도우의 타이틀 네임으로 윈도우의 핸들을 얻어오는 것이지만...
    개인적으론 DLL 인젝션등의 리버스 엔지니어링으로 해보셨으면 하는 아쉬움도 남네요..
    아무래도 윈도우 네임만 변경되면 또소스를 수정해야되는 번거로움이 생기니까 말이지요

    마지막으로 기왕에 문자를 쓰신다면 인코딩생각하셔야되기 때문에
    윈도우 환경에서는 CString 을 추천합니다.
    (아스키, 유니코드 생각할 필요가 없으니..물론 UTF-8, UTF-15,EUC-KR 같은 인코딩한다면 따로 라이브러리를 만드는 편이 좋겠지만요)

    • Favicon of http://blog.danggun.net BlogIcon 당근천국 2011.12.30 08:14 신고  Address  Edit/Delete

      저는 특별한 경우가 아니면 mfc는 사용하지 않습니다.
      몇가지 이유가 있긴한데 어차피 별이유는 아니라 ㅎㅎㅎ

      이글에서 인젝션같은 것들은 범위자체가 아니여서 따로 넣지 않았습니다만...뭐 다른 글에서 다룰지 말지는 아직 미지수입니다 ㅎㅎㅎ

      실행중인 프로그램의 여러가지이고 그중 한가지 일뿐이죠 ㅎㅎㅎ
      기법같은걸 알려주기 위한 글이 아니라서 일정수준을 안넘긴것이죠 ㅎㅎㅎ

  2. 0000 2012.07.09 16:17 신고  Address  Edit/Delete  Reply

    전체 코드를 보여주시면 안되나요?ㅠㅠ
    자꾸 오류가 나는데

  3. 0000 2012.07.10 16:15 신고  Address  Edit/Delete  Reply

    네이트온 하시면 이메일좀 적어주세요.ㅠ
    너무 두서없는 글이될거같아서..
    spy++로 핸들값을 구한다음에
    sendmessage로 특정 문자열을 누르게하고싶은데
    잘 안되는데..

    • Favicon of http://blog.danggun.net BlogIcon 당근천국 2012.07.12 10:12 신고  Address  Edit/Delete

      덧글로만 답변합니다 ^^;
      xp에서 이코드가 동작하지 않는다면 몬가 문제가 있는 것이고요 윈7에서는 테스트를 해보지 않아서 잘 모르겠습니다.

  4. fdfds 2013.01.13 13:42 신고  Address  Edit/Delete  Reply

    메모장의 내용을 얻어서
    printf문으로 출력을하니 1바이트만 인식이되는데 왜그러죠?..
    메모장 내용
    asdasd면
    a만 출력되요 ㅠㅠ..

    • Favicon of http://blog.danggun.net BlogIcon 당근천국 2013.01.15 00:57 신고  Address  Edit/Delete

      xp에서 확인된 코드이므로 운영체제부터 확인해보세요.
      32비트형인지 64비트형인지 확인해보셔야 할듯 하네요.

댓글 작성

이름
패스워드
홈페이지
비밀글

티스토리 툴바