°­ÁÂ¿Í ÆÁ

´Ù¸¥ ÇÁ·Î¼¼½ºÀÇ IME ¸ðµå Á¶»ç ¹× º¯°æ ³¯Â¥:2022-2-22 7:54:53 Á¶È¸¼ö:368
ÀÛ¼ºÀÚ : daypark
Æ÷ÀÎÆ® : 1079
°¡ÀÔÀÏ : 2020-02-14 10:42:05
¹æ¹®È½¼ö : 227
±Û 160°³, ´ñ±Û 26°³
¼Ò°³ : ÀÚ±â¼Ò°³¸¦ ÀÔ·ÂÇϽʽÿÀ.
ÀÛ¼º±Û º¸±â
ÂÊÁö º¸³»±â
IME ¸ðµå´Â ¹®ÀÚ ÀÔ·Â ¹æ½ÄÀ» ÀǹÌÇϴµ¥ ½±°Ô ¸»Çؼ­ ÇѱÛÀÌ³Ä ¿µ¹®À̳ÄÀÔ´Ï´Ù.
°¢ ½º·¹µå¸¶´Ù IME ÄÁÅØ½ºÆ®¸¦ µû·Î °¡Áö´Âµ¥ ½º·¹µå ¼Ò¼ÓÀÇ À©µµ¿ì´Â ¸ðµÎ °°Àº ¸ðµå¸¦ ¾¹´Ï´Ù.
ÇÁ·Î¼¼½º¸¶´Ù UI ½º·¹µå°¡ ¿©·¯ °³ Àִ Ư¼öÇÑ °æ¿ì¸¦ »©°í´Â º¸Åë °°Àº ÇÁ·Î±×·¥ÀÇ À©µµ¿ì´Â IME ¸ðµå°¡ °°Àº ¼ÀÀÌÁÒ.
»ç¿ëÀÚ°¡ ÇѱÛŰ³ª Shift+Space¸¦ ´­·¯ ¸ðµå¸¦ ¹Ù²ã°¡¸ç ¾²´Âµ¥ ¶§·Î´Â ÇÁ·Î±×·¥ÀÌ Á÷Á¢ ÀÌ ¸ðµå¸¦ Á¶Á¤ÇØ¾ß ÇÒ °æ¿ì°¡ ÀÖ½À´Ï´Ù.
¹Ýµå½Ã ¿µ¹®À¸·Î ÀÔ·Â¹Þ¾Æ¾ß ÇѴٰųª ½ÃÀÛÇÏÀÚ ¸¶ÀÚ Çѱ۷ΠÀԷ¹ÞÀ» ¶§ µîµî
±×·±µ¥ ÀÚ½ÅÀÌ ½º½º·ÎÀÇ IME ¸ðµå¸¦ Á¶»çÇϰųª º¯°æÇÏ´Â °ÍÀº ¾ÆÁÖ °£´ÜÇÕ´Ï´Ù.
¹Ý¸é ´Ù¸¥ ÇÁ·Î¼¼½ºÀÇ ¸ðµå¸¦ Á¶»çÇϰųª º¯°æÇÏ´Â °ÍÀº °£´ÜÄ¡°¡ ¾Ê½À´Ï´Ù.
´ÙÀ½ ¿¹Á¦´Â ÀÌ·± ¹æ¹ýÀ» ¿¬±¸ÇØ º¸±â À§ÇØ ¸¸µé¾ú½À´Ï´Ù. 

#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE g_hInst;
HWND hWndMain;
LPCTSTR lpszClass = TEXT("IMEControl");

int APIENTRY WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance
    , _In_ LPSTR lpszCmdParam, _In_ int nCmdShow)
{
    HWND hWnd;
    MSG Message;
    WNDCLASS WndClass;
    g_hInst = hInstance;

    WndClass.cbClsExtra = 0;
    WndClass.cbWndExtra = 0;
    WndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
    WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    WndClass.hInstance = hInstance;
    WndClass.lpfnWndProc = WndProc;
    WndClass.lpszClassName = lpszClass;
    WndClass.lpszMenuName = NULL;
    WndClass.style = CS_HREDRAW | CS_VREDRAW;
    RegisterClass(&WndClass);

    hWnd = CreateWindow(lpszClass, lpszClass, WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, 600, 400,
        NULL, (HMENU)NULL, hInstance, NULL);
    ShowWindow(hWnd, nCmdShow);

    while (GetMessage(&Message, NULL, 0, 0)) {
        TranslateMessage(&Message);
        DispatchMessage(&Message);
    }
    return (int)Message.wParam;
}

#include <imm.h>
#pragma comment(lib, "imm32.lib")

TCHAR stNotepad[256] = L"¸Þ¸ðÀå ½ÇÇàÁß ¾Æ´Ô";
TCHAR stForeWnd[256] = L"Ȱ¼º À©µµ¿ì »óÅ ¸ð¸§";
HWND hNotepad = NULL;
HWND hForeWnd = NULL;
enum { ENG, HAN };
enum { N_TOGGLE, N_HAN, N_ENG, F_TOGGLE, F_HAN, F_ENG };

// ƯÁ¤ À©µµ¿ìÀÇ IME ¸ðµå¸¦ Á¶»çÇÑ´Ù.
int GetWndIMEMode(HWND hWnd)
{
    if (hWnd == NULL) return -1;
    HWND hIme = ImmGetDefaultIMEWnd(hWnd);
    if (hIme == NULL) return -1;
    // ¸í·É 5ÀÇ Àǹ̸¦ ¾Ë ¼ö ¾øÀ½. 
    return (int)SendMessage(hIme, WM_IME_CONTROL, 5, NULL);
}

// ƯÁ¤ À©µµ¿ìÀÇ IME ¸ðµå º¯°æ. µ¿ÀÛÇÏÁö ¾ÊÀ½
void SetWndIMEMode(HWND hWnd, int imeMode)
{
    if (hWnd == NULL) return;
    int nowMode = GetWndIMEMode(hWnd);
    if (nowMode != imeMode) {
        SendMessage(hWnd, WM_KEYDOWN, VK_HANGUL, 0);
        SendMessage(hWnd, WM_KEYUP, VK_HANGUL, 0);
    }
}

// IME ¸ðµå Åä±ÛÀ» À§ÇÑ Å°º¸µå À̺¥Æ® °­Á¦ »ý¼º. ´ë»óÀº Ç×»ó ÇöÀç Æ÷Ä¿½º¸¦ °¡Áø Ȱ¼º À©µµ¿ìÀÌ´Ù.
void ToggleIMEMode()
{
    keybd_event(VK_HANGUL, 0, 0, 0);
    keybd_event(VK_HANGUL, 0, KEYEVENTF_KEYUP, 0);
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    DWORD imeMode;
    TCHAR cap[256];

    switch (iMessage) {
    case WM_CREATE:
        hWndMain = hWnd;
        SetTimer(hWnd, 1, 1000, NULL);
        CreateWindow(TEXT("button"), TEXT("Åä±Û"), WS_CHILD | WS_VISIBLE |
            BS_PUSHBUTTON, 10, 30, 90, 25, hWnd, (HMENU)N_TOGGLE, g_hInst, NULL);
        CreateWindow(TEXT("button"), TEXT("ÇѱÛ"), WS_CHILD | WS_VISIBLE |
            BS_PUSHBUTTON, 110, 30, 90, 25, hWnd, (HMENU)N_HAN, g_hInst, NULL);
        CreateWindow(TEXT("button"), TEXT("¿µ¹®"), WS_CHILD | WS_VISIBLE |
            BS_PUSHBUTTON, 210, 30, 90, 25, hWnd, (HMENU)N_ENG, g_hInst, NULL);
        CreateWindow(TEXT("button"), TEXT("2ÃÊ ÈÄ Åä±Û"), WS_CHILD | WS_VISIBLE |
            BS_PUSHBUTTON, 10, 130, 90, 25, hWnd, (HMENU)F_TOGGLE, g_hInst, NULL);
        CreateWindow(TEXT("button"), TEXT("2ÃÊ ÈÄ ÇѱÛ"), WS_CHILD | WS_VISIBLE |
            BS_PUSHBUTTON, 110, 130, 90, 25, hWnd, (HMENU)F_HAN, g_hInst, NULL);
        CreateWindow(TEXT("button"), TEXT("2ÃÊ ÈÄ ¿µ¹®"), WS_CHILD | WS_VISIBLE |
            BS_PUSHBUTTON, 210, 130, 90, 25, hWnd, (HMENU)F_ENG, g_hInst, NULL);
        return 0;
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        TextOut(hdc, 10, 10, stNotepad, lstrlen(stNotepad));
        TextOut(hdc, 10, 110, stForeWnd, lstrlen(stForeWnd));
        EndPaint(hWnd, &ps);
        return 0;
    case WM_COMMAND:
        switch (LOWORD(wParam)) {
        case N_TOGGLE:
            SetWndIMEMode(hNotepad, GetWndIMEMode(hNotepad) == HAN ? ENG:HAN);
            break;
        case N_HAN:
            SetWndIMEMode(hNotepad, HAN);
            break;
        case N_ENG:
            SetWndIMEMode(hNotepad, ENG);
            break;
        case F_TOGGLE:
            SetTimer(hWnd, F_TOGGLE, 2000, NULL);
            break;
        case F_HAN:
            SetTimer(hWnd, F_HAN, 2000, NULL);
            break;
        case F_ENG:
            SetTimer(hWnd, F_ENG, 2000, NULL);
            break;
        }
        return 0;
    case WM_TIMER:
        switch (wParam) {
        case 1:
            hNotepad = FindWindow(L"NotePad", NULL);
            if (hNotepad == NULL) {
                lstrcpy(stNotepad, L"¸Þ¸ðÀå ½ÇÇàÁß ¾Æ´Ô");
            } else {
                imeMode = GetWndIMEMode(hNotepad);
                wsprintf(stNotepad, L"¸Þ¸ðÀå : %s", imeMode == 1 ? L"ÇѱÛ" : L"¿µ¹®");
            }
            hForeWnd = GetForegroundWindow();
            if (hForeWnd == NULL) {
                lstrcpy(stForeWnd, L"Ȱ¼º À©µµ¿ì¸¦ ãÀ» ¼ö ¾øÀ½");
            } else {
                imeMode = GetWndIMEMode(hForeWnd);
                GetWindowText(hForeWnd, cap, 256);
                wsprintf(stForeWnd, L"Ȱ¼º À©µµ¿ì(%s) : %s", cap, imeMode == 1 ? L"ÇѱÛ" : L"¿µ¹®");
            }
            InvalidateRect(hWnd, NULL, TRUE);
            break;
        case F_TOGGLE:
            // 2ÃÊÈÄ È°¼º À©µµ¿ì IME ¸ðµå Åä±Û. Æ÷Ä¿½º¸¦ ¿Å±æ ¼ö ÀÖµµ·Ï 2ÃÊÀÇ ½Ã°£À» ÁØ´Ù.
            KillTimer(hWnd, F_TOGGLE);
            ToggleIMEMode();
            break;
        case F_HAN:
            KillTimer(hWnd, F_HAN);
            hForeWnd = GetForegroundWindow();
            if (hForeWnd != NULL) {
                imeMode = GetWndIMEMode(hForeWnd);
                if (imeMode == 0) {
                    ToggleIMEMode();
                }
            }
            break;
        case F_ENG:
            KillTimer(hWnd, F_ENG);
            hForeWnd = GetForegroundWindow();
            if (hForeWnd != NULL) {
                imeMode = GetWndIMEMode(hForeWnd);
                if (imeMode == 1) {
                    ToggleIMEMode();
                }
            }
            break;
        }
        return 0;
    case WM_DESTROY:
        KillTimer(hWnd, 1);
        PostQuitMessage(0);
        return 0;
    }
    return(DefWindowProc(hWnd, iMessage, wParam, lParam));
}

¸Þ¸ðÀå°ú Ȱ¼º À©µµ¿ì¿¡ ´ëÇØ IME ¸ðµå¸¦ Á¶»ç ¹× º¯°æÇÏ´Â ÄÚµåÀÔ´Ï´Ù.
Á¶»çÇÒ ¶§´Â WM_IME_CONTROL ¸Þ½ÃÁö·Î 5¹ø ¸í·ÉÀ» º¸³»¸é µË´Ï´Ù.
¸í·É 5´Â ±¸±Û¸µÇؼ­ ã¾Æ³½ °Çµ¥ ±¸Ã¼ÀûÀÎ Àǹ̴ ¾ÆÁ÷ ¸ð¸£°Ú¾î¿ä.
¾Æ¹«Æ° Àß Á¶»çµË´Ï´Ù.

ƯÁ¤ À©µµ¿ìÀÇ IME ¸ðµå¸¦ °­Á¦·Î º¯°æÇÏ´Â ¹æ¹ýÀº ¾ÆÁ÷ ãÁö ¸øÇß½À´Ï´Ù. 
SendMessage·Î VK_HANGUL ۸¦ º¸³»µµ ¹Ù²îÁö ¾Ê´õ±º¿ä.
ÀÌ ºÎºÐÀº Á» ´õ ¿¬±¸°¡ ÇÊ¿äÇѵ¥ ÇÁ·Î¼¼½º°£ÀÇ °£¼·ÀÌ¶ó ½±Áö ¾ÊÀ» °Å °°³×¿ä.

Ȱ¼º À©µµ¿ìÀÇ ¸ðµå¸¦ º¯°æÇÏ´Â °ÍÀº ±×³ª¸¶ Á» °£´ÜÇÕ´Ï´Ù. 
keydb_event ÇÔ¼ö·Î ½Ã½ºÅÛ¿¡ VK_HANGUL ۸¸ º¸³»¸é µË´Ï´Ù.
ÀÌ Å°°¡ Æ÷Ä¿½º¸¦ °¡Áø À©µµ¿ì·Î Àü´ÞµÇ¾î ¸ðµå¸¦ ¹Ù²Ù°Ô µË´Ï´Ù.
Áï, ÀÌ ¸í·ÉÀº IME ¸ðµå¸¦ Åä±ÛÇÕ´Ï´Ù.
ƯÁ¤ »óÅ·Π¹Ù²Ù°í ½ÍÀ¸¸é ÇöÀç »óŸ¦ ¸ÕÀú Á¶»çÇÑ ÈÄ ¿øÇÏ´Â »óŰ¡ ¾Æ´Ï¸é Åä±ÛÇÏ¸é µÇ°ÚÁÒ. 



Å×½ºÆ® ¿¹Á¦´Â 2ÃÊ ÈÄ¿¡ Ȱ¼º À©µµ¿ìÀÇ IME ¸ðµå¸¦ Åä±Û ¶Ç´Â ÇÑ, ¿µ ¸ðµå·Î °¢°¢ ÀüȯÇÕ´Ï´Ù.
2ÃÊÀÇ ½Ã°£À» µÐ ÀÌÀ¯´Â ¹öưÀ» ´©¸¦ ½ÃÁ¡¿¡´Â Ç×»ó ÀÌ ÇÁ·Î±×·¥ÀÌ È°¼º À©µµ¿ìÀ̱⠶§¹®¿¡
¿øÇÏ´Â À©µµ¿ì·Î Æ÷Ä¿½º¸¦ ¿Å±æ ½Ã°£À» ÁÖ´Â °Ì´Ï´Ù.
¾ÆÁÖ Àß µ¿ÀÛÇÏ¸ç °¡»ó Űº¸µåó·³ ³²ÀÇ IME ¸ðµå¸¦ °Çµå·Á¾ß ÇÏ´Â ÇÁ·Î±×·¥¿¡¼­ ÀÌ ±â´ÉÀÌ À¯¿ëÇÕ´Ï´Ù.
ƯÁ¤ À©µµ¿ìÀÇ IME ¸ðµå¸¦ º¯°æÇÏ´Â ¹æ¹ýÀº ¾ÆÁ÷ ãÁö ¸øÇߴµ¥ ¾øÀ» ¼öµµ ÀÖ½À´Ï´Ù.
Á» ´õ ¿¬±¸ÇØ º¸°í ´õ ÁÁÀº ¹æ¹ýÀ» ãÀ¸¸é ´ñ±Û·Î ±â·ÏÇϵµ·Ï ÇÒ°Ô¿ä.



 


 

¸ñ·Ïº¸±â »èÁ¦ ¼öÁ¤ ½Å°í ½ºÅ©·¦


·Î±×ÀÎÇÏ¼Å¾ß ´ñ±ÛÀ» ´Þ ¼ö ÀÖ½À´Ï´Ù.