전체 글 (205)
WNDPROC oldProc; HWND hWnd=NULL; LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { default: ; } return CallWindowProc(oldProc, hwnd, message, wParam, lParam); } extern "C" BOOL APIENTRY DllMain(HINSTANCE hInst, DWORD reason, LPVOID reserved) { switch(reason) { case DLL_PROCESS_ATTACH: { if(hWnd==NULL) { //hWnd = ~ oldProc=(WNDPROC)SetWindowLongPt..
void set_composition_window(int xpos, int ypos) { if(hIMC=ImmGetContext(hWnd)) { COMPOSITIONFORM cf; cf.dwStyle=CFS_POINT; cf.ptCurrentPos.x=xpos; cf.ptCurrentPos.y=ypos; ImmSetCompositionWindow(hIMC, &cf); ImmReleaseContext(hWnd, hIMC); } } 한글 조합 상자의 위치를 바꿔줍니다. 단, 한글 조합 상자의 윈도우는 계속 생겨나고 파괴되기 때문에 수시로 바꿔주어야 합니다. 아예 박스 윈도우가 생성되지 않게 하시려면, IME 메시지 중 WM_IME_STARTCOMPOSITION 메시지가 오면 메시지를 넘기지 않고 return..
아래의 두 가지 방법이 있습니다. 엮인 글: IME 한/영 상태 얻기 void set_language(double mode) { if(hIMC=ImmGetContext(hWnd)) { ImmNotifyIME(hIMC, NI_COMPOSITIONSTR, CPS_CANCEL, 0); DWORD dwConv, dwSent, dwTemp; BOOL bRet=ImmGetConversionStatus(hIMC, &dwConv, &dwSent); if(bRet) { dwTemp=dwConv & ~IME_CMODE_LANGUAGE; if(mode==0){dwTemp |= IME_CMODE_ALPHANUMERIC;} else{dwTemp |= IME_CMODE_NATIVE;} dwConv=dwTemp; ImmSetCon..
아래의 두 가지 방법이 있습니다. 엮인 글: IME 한/영 상태 전환하기 int get_language() { BOOL bRet=FALSE; if(hIMC=ImmGetContext(hWnd)) { DWORD fdwConversion, fdwSentence; BOOL bRet2=ImmGetConversionStatus(hIMC, &fdwConversion, &fdwSentence); if(bRet2){bRet=(fdwConversion & IME_CMODE_NATIVE ? TRUE : FALSE);} ImmReleaseContext(hWnd, hIMC); } return bRet; } int get_language() { BOOL bRet=FALSE; if(hIMC=ImmGetContext(hWnd)) {..
void set_string_ansi(char *str) { if(hIMC=ImmGetContext(hWnd)) { ImmSetCompositionStringA(hIMC, SCS_SETSTR, str, strlen(str)+1, NULL, 0); ImmReleaseContext(hWnd, hIMC); } } IME 한글 조합 박스에 있는 한글을 바꾸는 코드입니다. ImmSetCompositionStringA 는 아스키코드 문자열을, ImmSetCompositionStringW 는 유니코드 문자열을 의미합니다. 두 개의 함수 중 골라서 쓰시면 됩니다. 엮인 글: IME Composition Window 내용 얻기
char char_ansi[3]={0,}; void get_string_ansi() { char_ansi[0]=NULL; if(hIMC=ImmGetContext(hWnd)) { ImmGetCompositionStringA(hIMC, GCS_COMPSTR, char_ansi, ImmGetCompositionStringA(hIMC, GCS_COMPSTR, NULL, 0)); ImmReleaseContext(hWnd, hIMC); } } IME 한글 조합 박스에 있는 한글을 얻는 코드입니다. ImmGetCompositionStringA 는 아스키코드의 문자열을, ImmGetCompositionStringW 는 유니코드 형식의 문자열을 반환합니다. 엮인 글: IME Composition Window 내용 바꾸기
HWND hWnd=NULL; void get_hwnd() { if(hWnd==NULL) { ULONG idProc; DWORD TempCurrProcId=GetCurrentProcessId(); hWnd=FindWindow(NULL, NULL); while(hWnd!=NULL) { if(GetParent(hWnd)==NULL) { GetWindowThreadProcessId(hWnd, &idProc); if(TempCurrProcId==idProc){break;} } hWnd=GetWindow(hWnd, GW_HWNDNEXT); } } } 프로세스 ID 를 이용한 최상위 핸들을 구하는 방법입니다. hWnd 전역변수에 핸들이 구해집니다.
게임메이커, 게임메이커: 스튜디오용으로 제작된 DLL 입니다. wxDev-C++ 컴파일러로 제작되었습니다. IME 핸들을 구해서 한/영 상태를 변경하거나 조합 중인 한글을 반환하는 역할을 합니다. 함수에서, ANSI 는 아스키코드의 약자입니다. 게임메이커8.0 버전과 하위 버전에서는 이 형식을 사용합니다. UTF-8 형식은 게임메이커8.0 버전보다 상위 버전에서 사용합니다. 새로운 버전에서는 ime_set_composition_window 함수의 최적화와 DLL 을 UPX 형식으로 실행 압축하여 용량을 줄였습니다. 함수 ime_get_string_ansi() : string 현재 조합중인 문자열을 아스키코드형식으로 반환합니다. ime_get_string_utf8() : string 현재 조합중인 문자열을..
이번에는 IF 문을 이용하여 이런 식으로 코드를 짰다고 가정해봅시다. 보통 이런 경우는 문자열이 메모리상에 저장되기 때문에 쉽게 이메일 주소를 얻을 수가 있습니다만, 우리는 어떤 값을 입력해도 이메일 주소가 나오게 수정을 하고자 합니다. 올리디버거로 열어보면 이런 식의 간단한 어셈블리어로 되어있습니다. 이중 JE ~ 쪽을 눌러봅시다. 빨간 게 꼭 누르고 싶지 않나요? 그런데 옆에 화살표가 00401B5F 즉 알맞은 값을 가리키고 있네요? 여러분은 이제 이것이 IF문과 비슷한 역할을 한다고 생각을 해보아도 될 것 같습니다. 아마 조건이 되면 저 주소로 점프하는 거 같지 않나요? 그래요. 위에 JE 위에 CMP 라고 먼저 조건을 가정하고 점프를 하는 것입니다. 명령어에 관한 내용은 http://shakii...