본문 바로가기

Application Dev./C++/MFC

(19)
멀티미디어 타이머 이용 방법 멀티미디어 타이머 이용 방법 WM_TIMER 메시지를 이용한 방법이나 멀티미디어 타이머를 이용한 방법에서는 반복주기를 msec 단위로 지정해 줄 수가 있습니다. 그러나, WM_TIMER를 이용한 방법에서는 사실상 정확한 반복주기를 유지한다는 것이 불가능하여 수십 msec만큼의 정밀도밖에 가지지 못합니다. 반면에, 이 문서에서 설명할 멀티미디어 타이머는 최대 1msec까지 그 정밀도가 보장됩니다. 고정된 시간간격의 유지가 필수적인 애플리케이션에 유용한 방법입니다. 2-1. 타이머 생성 : timeSetEvent 함수 이용 MMRESULT timeSetEvent(UINT uDelay, UINT uResolution, LPTIMECALLBACK lpTimeProc, DWORD dwUser, UINT fuEve..
CHotKeyCtrl 컨트롤 & 메시지들 CHotKeyCtrl styles (=common control styles) 설 명 CCS_ADJUSTABLE 툴바의 위치나 버튼의 위치, 크기, 삽입, 삭제등을 할 수 있게 한다. CCS_BOTTOM 컨트롤을 부모 윈도우의 client 영역 맨 아래에 client영역 너비크기와 같은 너비를 가지고 위치하도록 한다. CCS_LEFT 컨트롤을 부모 윈도우의 왼쪽에 표시되도록 한다 CCS_NODIVIDER 부모윈도우와 구분이 되는 두줄의 하이라이트 픽셀을 그리지 않는다 CCS_NOMOVEX 수직으로 사이즈나 위치를 옮길 수 있으나 수평으로는 못하게 한다 CCS_NOMOVEY 수평으로 사이즈나 위치를 옮길 수 있으나 수직으로는 못하게 한다 CCS_NOPARENTALIGN 컨트롤이 자동으로 위나 아래에 정렬되..
모니터 해상도 구하기 1. GetDesktopWindow(), GetWindowRect() - Desktop도 하나의 윈도우이므로, Desktop의 윈도우 핸들을 얻어 창크기를 구하는 방식 CRect rcDesktop; ::GetWindowRect(GetDesktopWindow()->m_hWnd, &rcDesktop); int width = rcDesktop.right - rcDesktop.left; int height = rcDesktop.bottom - rcDesktop.top; RECT rcDesktop; HWND hWndDesktop = RECT rcDesktop; HWND hWndDesktop = GetDesktopWindow(); GetWindowRect(hWndDesktop, &rcDesktop); int wid..
다이얼로그에 상태표시줄(Status Bar) 장착하기! - Header public: CStatusBarCtrl m_StatusBar; - CPP m_StatusBar.Create(WS_CHILD|WS_VISIBLE|SBT_OWNERDRAW, CRect(0,0,0,0), this, 0); int strPartDim[4]= {180, 300, 300, 450 -1}; m_StatusBar.SetParts(4, strPartDim); m_StatusBar.SetText("테스트1", 0, 0); m_StatusBar.SetText("테스트2", 1, 0); m_StatusBar.SetText("아이콘", 3 ,SBT_NOBORDERS); m_StatusBar.SetIcon(3, SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME), F..
WinNT 계열에서 프로세스 강제종료하기 Windows에서 프로세스를 강제 종료하려면 TerminateProcess() API를 사용하면 된다. 그런데 Windows NT 계열에서 TerminateProcess()를 사용하려면 PROCESS_TERMINATE 접근 권한을 가지는 프로세스 핸들이 필요하다. OpenProcess()로 PROCESS_TERMINATE 접근 권한의 프로세스 핸들을 얻을 수 있는데 그 전에 먼저 SeDebugPrivilege 권한을 획득해야 한다. 따라서 프로세스를 종료하기 위한 절차는 다음과 같다. 1. 현재 프로세스의 권한을 변경하기 위한 액세스 토큰의 핸들을 가져온다. OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hTok..
윈도우 강제(자동)종료, 재부팅, 로그오프 TOKEN_PRIVILEGES ns; HANDLE htoken; LUID LID; LUID_AND_ATTRIBUTES att; if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &htoken)) { MessageBox("Process token을 열 수 없습니다.\n"); return; } if(!LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &LID)) { MessageBox("Privilege를 찾을 수 없습니다.\n"); return; } // Shutdown privilege 활성화 att.Attributes = SE_PRIVILEGE_ENABLED; att.Luid = LID; // Privi..
API의 기본 정의 API란 Application Programming Interface의 약자이며, 우리말로 풀어본다면 운영체제가 응용 프로그램을 위해 제공하는 함수의 집합이라고 정의할 수 있다. 운영 체제는 하드웨어와 응용 프로그램 사이에 위치하며 응용 프로그램을 대신하여 하드웨어를 관리하고 메모리를 관리하느 시스템 소프트웨이다. 특정 운영체제에서 실행되는 응용 프로그램은 운영체제에 종속적일 수 밖에 없으며 운영체제가 규정한 바대로 하드웨어를 엑세스해야 한다. 또한 윈도우즈와 같은 멀티 태스킹 운영체제의 경우 응용 프로그램간 상호작용을 할 때도 운영체제의 규정을 따라야만 한다. 그러나 현식적으로 응용 프로그램 개발자들이 이러한 운용체제의 내부 동작까지 속속들이 이해하고 있을 수는 없다. 그래서 운영체제는 가장 기본적인 ..
MessageBox() 사용법 int MessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType); hWnd 메시지 박스의 오너(Owner) 윈도우이다. 오너 윈도우란 메시지 상자를 소유한 윈도우를 말하며 메시지 박스는 오너 윈도우의 중앙에 나타나며 메시지 박스가 떠 있는 동안 오너 윈도우 는 사용할 수 없는 상태가 된다. 메시지 박스를 닫아야만 오너 윈도우를 사용할 수 있다. lpText 메시지 박스에 출력할 문자열 lpCaption 메시지 상자의 타이틀 바에 나타날 제목 문자열 uType DWORD값 참조 값 설명 MB_ABORTRETRYIGNORE Abort, Retry, Ignore 세 개의 버튼이 나타난다. MB_OK OK버튼 하나만 나타난다. MB_OKCANCE..