본문 바로가기
C & C++/C & C++

메모장을 API를 이용하여 주물럭 거려보자

by izen8 2011. 11. 2.
반응형

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

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


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


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


1
2
3
4
5
6
7
8
//메모장의 핸들 저장용 
HWND hwndNotepad;
   
//차일드 핸들 저장용
HWND hwndNotepadChild;
  
//이 문자열을 출력한다.
LPCTSTR  strText = L"메모짱 하악하악 (ㅡ.ㅡ;;;)";


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

1
2
3
4
5
6
7
8
//메모장 핸들을 찾는다. 
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. 코드변경



1
2
3
4
5
//메모장 핸들을 찾는다.
//hwndNotepad = FindWindow(L"Notepad", NULL);
  
//활성화 된 창의 핸들을 가저온다.
hwndNotepad = GetForegroundWindow();



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

 

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


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


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

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



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


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//메모장 핸들을 찾는다.
  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에서 추가된 코드는 주석 처리헸습니다.(테스트할때 귀찬아서 ㅡ.-;)
메모장 내용의 가변성을 염두해두고 코드를 만든 것이기때문에 조금 복잡해 보이긴 하지만 친절한 주석씨(?) 덕분에 힘들지 않을 거라 생각합니다.

반응형

댓글