728x90

프로그램이 동작하는 도중에 다른 프로그램을 실행해야 하는 상황이 있다.

이럴 때에는 CreateProcess()혹은 WinExec() 등의 다양한 방법이 있겠지만, 나의 경우에는 CreateProcess()가 익숙하므로

이것에 대해서 일단 정리를 해둔다.


CreateProcess()의 첫 번째 인자 값으로는 프로그램이 위치한 절대 경로를 입력해서 사용하고,

만약 상대 경로의 경우에는 첫 번째 인자 값으로는 NULL, 두 번째 인자 값으로 상대 경로를 넣으면 된다.



728x90
728x90

프로그램의 실행 경로를 가져오기 위해서는 아래와 같이 하면 된다.



코드는 따로 설명할게 없네...



728x90
728x90

Windows API 중에 SetLayeredWindowAttributes()를 이용하여 윈도우를 투명하게 바꿀 수 있다.


// make it transparent

long l = GetWindowLong(m_hWnd, WL_EXSTYLE);

l |= WS_EX_LAYERED;

SetWindowLong(m_hWnd, GWL_EXSTYLE, l);

SetLayeredWindowAttributes(m_hWnd, 0, nOpacity, LWA_ALPHA);


이 API를 이용하면, 프레임 드랍이 굉장히 심하다...



그래서 구글에서 검색해본 결과, Windows의 Aero 기능을 활용하는 방법이 있었다.


DWM(Desktop Window Manager)가 실행되어 있어야하므로, 프로세스에 dwm.exe가 실행되어 있어야 한다.


// Set margins, extending the bottom margin

MARGINS margins = { -1, -1, -1, -1 };

int val = 0;    // 2;

hr = DwmSetWindowAttribute(m_hWnd, 2, &val, 4);


// Extend frame on the bottom of client area

hr = DwmExtendFrameIntoClientArea(m_hWnd, &margins);


위의 코드를 활용한다면, Aero 기능을 활용하기 때문에 SetLayeredWindowAttributes() 보다는 쓸만 했다.

728x90
728x90

#include <windows.h>

#include <iostream>

#include <tchar.h>


int main()

{

    _wsetlocale(LC_ALL, _T("Korean"));


    wchar_t strText[MAX_PATH] = { 0, };

    HINSTANCE hLanguageDll = nullptr;

    LANGID wLanguageID = 0;


    // OS의 언어 ID를 가져온다.

    wLanguageID = GetUserDefaultUILanguage();

    //wLanguageID = 0x412;    // 한글

    //wLanguageID = 0x409;    // 영어


    switch (wLanguageID)

    {

    case 0x409 :    // 영어

        hLanguageDll = LoadLibrary(_T("Language_Eng"));        

        break;


    case 0x412 :    // 한글

        hLanguageDll = LoadLibrary(_T("Language_Kor"));        

        break;

    }


    if (hLanguageDll == nullptr)

        return -1;


    LoadString(hLanguageDll, 101, strText, MAX_PATH);

    wprintf(L"%s \r\n", strText);


    FreeLibrary(hLanguageDll);


    getchar();

    return 0;

}



LANGID : https://msdn.microsoft.com/ko-kr/library/bb165625(v=vs.90).aspx

Display name

Value

Default charset

Arabic

1025

Arabic

Basque

1069

ANSI

Catalan

1027

ANSI

Chinese (Simplified)

2052

GB2312

Chinese (Traditional)

1028

Chinese-Big 5

Czech

1029

Eastern European

Danish

1030

ANSI

Dutch

1043

ANSI

English (United States)

1033

ANSI

Finnish

1035

ANSI

French

1036

ANSI

German

1031

ANSI

Greek

1032

Greek

Hebrew

1037

Hebrew

Hungarian

1038

Eastern European

Italian

1040

ANSI

Japanese

1041

Shift-JIS

Korean

1042

Johab

Norwegian

1044

ANSI

Polish

1045

Eastern European

Portuguese

2070

ANSI

Portuguese (Brazil)

1046

ANSI

Russian

1049

Russian

Slovakian

1051

Eastern European

Slovenian

1060

Eastern European

Spanish

3082

ANSI

Swedish

1053

ANSI

Turkish

1055

Turkish


참조 : http://copynull.tistory.com/91


StringTable.zip


728x90
728x90

현재 윈도우의 정확한 버전을 얻기 위해서는 Network Management 함수 중 하나인 NetWkstaGetInfo() 를 이용하는 것이다.




NetWkstaGetInfo ()가 다소 느리므로, 처음 호출할 때에는 버전을 알아내기 위해 NetWkstaGetInfo ()를 호출하고, 이 후에는 저장된 값으로 확인하는 것이 좋다.



VerifyVersionInfo() 를 이용하면, ServicePack 버전까지 알아낼 수 있다.




출처 : http://iamskylover.tistory.com/75


Source.cpp


728x90
728x90

기존 SetThreadLocale() 은 Windows Vista 부터 적용되지 않는다. (이것 때문에 삽질을...)


아래의 SetThreadLocaleEx() 는 Windows Vista에서도 사용이 가능한 코드이다.




아래는 SetThreadLocaleEx()를 사용하는 코드이다.



setlocale() 을 사용한 이유는 한글이 깨져서 나오기 때문에... 각 나라별 locale을 지정해야하는 것 같다.


사용 방법은 키보드 <- , -> 를 사용하면 IDS_STRING101에서 각각 다른 나라의 언어를 가져온다.



하지만, 이런 식으로 굳이 가져올 필요가 있을까 싶다....


하나의 나라 언어 중 문장 혹은 단어만 바꿔도 다시 컴파일을 해야하는데... 


차라리 DLL을 이용하자. ㅎㅎ



출처 : http://m.blog.naver.com/shin450279/40120852207


StringTable.zip


728x90
728x90
Sleep(1)을 했는데, 1ms를 자는게 아닐 때에는 timeBeginPeriod(), timeEndPeriod()를 이용하면 된다.

사용 예)
int main(void)
{
timeBeginPeriod(1);

....

timeEndPeriod(1);
return 0;
}

이 함수의 기능은 주기적인 타이머의 최소 해상도를 설정한다.

프로그램이 이상하게 Frame이 안나올 경우 이 함수를 이용해서 테스트 해보자.


"단점은 하드웨어에 좋지 않은 영향을 끼치기 때문에 기왕이면 사용하지 않는 것이 좋다.

하드웨어가 지원한다면 QueryPerformanceFrequency를 사용하는 것이 더 이득이다. "



Requirements:

Minimum supported client

Windows 2000 Professional [desktop apps only]

Minimum supported server

Windows 2000 Server [desktop apps only]

Header

Mmsystem.h (include Windows.h)

Library

Winmm.lib

DLL

Winmm.dll





728x90

+ Recent posts