프로그래밍 강의/C++ (8)
HINSTANCE hHookDll=NULL; HHOOK hHook=NULL; LRESULT CALLBACK GetMsgProc(int code, WPARAM wParam, LPARAM lParam) { MSG *msg=(MSG*)lParam; switch(msg->message) { default: ; } return CallNextHookEx(hHook, code, wParam, lParam); } extern "C" BOOL APIENTRY DllMain(HINSTANCE hInst, DWORD reason, LPVOID reserved) { switch(reason) { case DLL_PROCESS_ATTACH: { if(hHookDll==NULL){hHookDll=hInst;} break; } ..
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 전역변수에 핸들이 구해집니다.