IT_Programming/MFC · API

콘솔 프로그램과 ODBC 연결 / keybd_event에서 한글문제

JJun ™ 2007. 12. 25. 14:42

<콘솔 프로그램과 ODBC 연결>

콘솔에서 돌아가는 C 프로그램을 작성하고 있습니다. MS-SQL 서버와 연결하려면 어떻게

해야 합니까.

MFC를 이용한 응용 프로그램을 사용해 콘솔 프로그램을 만듭니다.

그런 후에 다음처럼 ODBC를 연결하면 됩니다.

    <리스트 1>콘솔 프로그램을 ODBC에 연결

    // 선언
    CDatabase m_dbSeaDB;

    // 구현
    // "Sss"는 ODBC에서 등록된 이름
    // _T("ODBC; DSN = Sss; UID = dba; PWD = sql") 는
    // ODBC를 열기 위한 명령

    m_dbSeaDB.Open("_T("Sss"), FALSE, FALSE, _T("ODBC; DSN = Sss; UID = dba; PWD = sql"));

    // 다음은 테이블을 열기 위한 예제입니다.
    // 위, 경도의 Long값 자료 두 개에서 코드가 007인 자료만 찾을 조건
    // 위, 경도는 문자열

    CRecordset ExamSet(&m_dbSeaDB);

    try {
         ExamSet.Open(
              CRecordset::forwardOnly, "SELECT Longi, Lati, Value1, Value2" \
                   FROM MyTable WHERE Code = '007' "
         );
    }

    catch(CDBException *e) {
         MessageBox(e->m_strError, "잘못!", MB_ICONSTOP);
         e->Delete();
         return;
    }

    // 읽어들인 자료를 핸들링
    CString strLo, strLa;
    CDBVariant varVel_e;
    CDBVariant varVel_n;

    while(!ExamSet.IsEOF()) {
         // 0, 1, 2, 3 은 SELECT 문의 순서
         ExamSet.GetFieldValue((short)0, strLo);
         ExamSet.GetFieldValue((short)0, strLa);

         // SQL_C_SLONGdms Value1, Value2를 Long으로 읽어들임.
         ExamSet.GetFieldValue((short)2, varVel_e, SQL_C_SLONG);

         ExamSet.GetFieldValue((short)3, varVel_n, SQL_C_SLONG);

         ExamSet.MoveNext();
    }

 

<keybd_event에서 한글문제>

SendMessage를 이용해 문자를 다른 윈도우에 보내다가 핸들 문제 때문에 keybd_event를 사용하려는데, 영어와 달리 한글의 경우는 전송이 원하는 대로 이뤄지지 않습니다. keybd_event에서 한글은 어떤 식으로 처리해 줘야 합니까.

keybd_event()를 제대로 쓰려면 고려할 사항이 있습니다. 일단 keybd_event()는 사용자가 키를 누르는 동작을 그대로 흉내내는 것이라 이해해야 합니다(즉, SendMessage()와는 아무런 관련이 없습니다). 예를 들어 키보드에서 'A' 키를 누른다고 항상 'A' 가 입력되는 것은 아니라는 말입니다. CAPS_LOCK이 안 눌려 있다면 'A' 키를 눌러도 'a' 로 입력됩니다. 이 경우 keybd_event() 로 CAPS_LOCK 키를 누르고 'A' 키를 눌러야 합니다.

    keybd_event(VK_CAPITAL, 0x45, KEYEVENTF_EXTENDEDKEY, 0);
    keybd_event(VK_CAPITAL, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
    keybd_event('A', MapVirtualKey('A', 0), 0, 0);
    keybd_event('A', MapVirtualKey('A', 0), KEYEVENTF_KEYUP, 0);

 물론 이전에 CAPS_LOCK 상태를 확인해야 하며, 방법은 다음과 같습니다.

    BOOL bState = GetKeyState(VK_CAPITAL);

  한글문제도 마찬가지입니다. IME 상태가 한글이라면 'A'키를 누르면 'ㅁ'가 입력되겠죠. 'S'를 누르면 'ㄴ'일테구요, 따라서 한글을 입력하려면 IME 상태를 확인한 후 영문이라면 한글 키를 누르는 과정이 들어가야 합니다. 즉, "My name is 바보." 를 입력하려면 (CAPS_LOCK : off, 한글 : off일 때) 다음과 같이 하면 됩니다.

> (shift down), M, (shift up), Y, (스페이스), N, A, M, E, (스페이스), I, S, (스페이스)
> (한글키), R, L, A, G, U, S, T, M, D, (한글키), .   // HP 그래픽 워크스테이션에서 한글

 이와 같이 이벤트를 발생시킨 다음, 한글키는 다음과 같이 사용합니다.

BOOL bState = GetKeyState(VK_HANGEUL);   // 한글이면 1, 아니면 0

if(!bState) {
   keybd_event(VK_HANGEUL, MapVirtualKey(VK_HANGEUL, 0), 0, 0);
   keybd_event(VK_HANGEUL, MapVirtualKey(VK_HANGEUL, 0), KEYEVENTF_KEYUP, 0);
}