[VC++] WinAPI를 이용하여 메모장을 주물럭거려보자
이 글은 윈도우XP 기준입니다.
다른 운영체제에서는 해당 API가 작동하지 않거나 다른 동작을 할 수 있습니다.
제가 올린 대부분의 예제는 유니코드를 기준으로 합니다.
(프로젝트 속성 -> 구성 속성 -> 일반 -> 문자 집합 -> 유니코드 문자 집합 사용)
'WinAPI'를 연습하기 참 좋은 소재가 메모장이죠 ㅎㅎㅎ
만만한게 메모장(으잌!)
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에서 추가된 코드는 주석 처리했습니다.
(테스트할 때 귀찮아서 ㅡ.-;)
메모장 내용의 가변성을 염두해두고 코드를 만든 것이기 때문에 조금 복잡해 보이긴 하지만...
친절한 주석씨(?) 덕분에 힘들지 않을 거라고 생각합니다.
마무리
오덕체로 설명하니 색다른데? ㅎㅎㅎ
나 오덕 아니라능!