순천향대학교컴퓨터학부이상정 1 학습내용 윈도우핸들 윈도우찿기 윈도우확인및제거 윈도우숨기기 윈도우포커스 윈도우텍스트
윈도우핸들 순천향대학교컴퓨터학부이상정 3 핸들 (handle) 윈도우에서구체적인어떤대상을구분하기위해지정되는고유의번호 32비트의정수값 핸들은운영체제가발급하고사용자가이값을사용 실제값이무엇인지는몰라도상관없음 윈도우, DC, 브러쉬등등 순천향대학교컴퓨터학부이상정 4
윈도우핸들 윈도우구분하기위한값 HWND 형 윈도우생성시부여 윈도우가살아있는동안반드시존재 윈도우생성 HWND hwnd = CreateWindow( ) HWND == 0 이면윈도우생성실패를의미 HINSTANCE와의차이 프로그램실행시적재된메모리위치에관한정보 윈도우핸들과비슷하지만윈도우가표시되지않는프로그램도 HINSTANCE 의값이지정됨 순천향대학교컴퓨터학부이상정 5 윈도우검색, 확인및제거 순천향대학교컴퓨터학부이상정 6
예제 10: 윈도우검색예 (1) 실행중인윈도우모두를검색하여출력창에클래스이름과윈도우타이틀을표시하는프로그램 순천향대학교컴퓨터학부이상정 7 예제 10: 윈도우검색예 (2) API 함수 BOOL EnumWindows(WNDENUMPROC lpenumfunc, LPARAM lparam ); 스크린상의윈도우들이차례로콜백함수 lpenumfunc 함수를호출하여자신의핸들을인수로전달 lpenumfunc: 호출되는콜백함수 lparam: 콜백함수에전달되는값 순천향대학교컴퓨터학부이상정 8
BOOL CALLBACK EnumWindowCallBack(HWND hwnd, LPARAM lparam) 예제 10: 코드 WCHAR szclassname[1024]=l""; WCHAR sztitle [1024]=L""; GetClassName(hWnd, szclassname,1023); GetWindowText(hWnd,szTitle,1023); if (wcslen(sztitle)>0) OutputDebugString(szClassName); OutputDebugString(L" / "); OutputDebugString(szTitle); OutputDebugString(L" n"); return true; LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) switch (message) case WM_LBUTTONDOWN: EnumWindows(EnumWindowCallBack, 0); break; case WM_COMMAND: 순천향대학교컴퓨터학부이상정 9 예제 11: 윈도우찾기예 (1) 특정윈도우를검색하여출력창에자신의핸들, 자신의부모핸들, 검색된핸들, 바탕화면핸들을표시하는프로그램 순천향대학교컴퓨터학부이상정 10
예제 11: 윈도우찾기예 (2) API 함수 HWND FindWindow(LPCTSTR lpclassname, LPCTSTR lpwindowname); 지정된클래스이름과타이틀의윈도를검색하여핸들을리턴 lpclassname: 클래스이름 lpwindowname: 윈도우타이틀 HWND GetDesktopWindow(void); 바탕화면의윈도우핸들을리턴 HWND GetParent(HWND hwnd); 지정된핸들의부모윈도우핸들을찾아서 hwnd 리턴 BOOL SetForegroundWindow(HWND); 지정된핸들의윈도우를화면의전경 (foreground) 에표시하고활성화 HWND GetForegroundWindow(void); 화면의전경에있는윈도우핸들을리턴 HWND GetFocus(void); 현재키보드포커스를갖는윈도우핸들리턴 순천향대학교컴퓨터학부이상정 11 예제 11: 코드 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) switch (message) case WM_LBUTTONDOWN: HWND hwnddesktop = GetDesktopWindow(); HWND hwndfind = FindWindow(L"DesktopExplorerWindow", L"Desktop"); HWND hwndparent = GetParent(hWnd); WCHAR sztemp[1024] = L""; wsprintf(sztemp, L" %X n %X n %X n %X n", hwnd, hwndparent, hwndfind, hwnddesktop); OutputDebugString(szTemp); SetForegroundWindow(hWndDesktop); break; case WM_COMMAND: 순천향대학교컴퓨터학부이상정 12
예제 12: 윈도우확인및제거예 (1) 바탕화면핸들이존재여부확인하고제거하는프로그램 실행윈도우종료해도바탕화면이제거되어나타나지않음 순천향대학교컴퓨터학부이상정 13 예제 12: 윈도우확인및제거예 (2) API 함수 BOOL IsWindow(HWND hwnd ); 지정된윈도우핸들이존재하는지조사 지정된윈도우가존재하면0이아닌값을리턴 BOOL DestroyWindow(HWND hwnd ); 지정된윈도우를종료 다음코드도동일한효과 SendMessage(hWnd,WM_CLOSE,NULL,NULL); 순천향대학교컴퓨터학부이상정 14
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) switch (message) case WM_LBUTTONDOWN: HWND hwnddesktop = GetDesktopWindow(); if (IsWindow(hWndDesktop) == TRUE) OutputDebugString(L"DeskTop Running n"); BOOL bres = DestroyWindow(hWndDesktop); // SendMessage(hWndDesktop,WM_CLOSE,NULL,NULL); // BOOL bres =!IsWindow(hWndDesktop); if (bres == TRUE) OutputDebugString(L"DeskTop DeskTop Killed n"); else OutputDebugString(L"DeskTop Kill Fail n"); else OutputDebugString(L"DeskTop is not Existing n"); break; case WM_COMMAND: 순천향대학교컴퓨터학부이상정 15 예제 12: 코드 윈도우비활성화, 숨기기, 텍스트 순천향대학교컴퓨터학부이상정 16
예제 13: 윈도우비활성화, 숨기기예 (1) 마우스왼쪽버튼누르면 5 초동안윈도우비활성화되고, 이후 3초동안윈도우사라진후다시나타나는프로그램 순천향대학교컴퓨터학부이상정 17 예제 13: 윈도우비활성화, 숨기기예 (2) API 함수 BOOL IsWindowEnabled(HWND hwnd); 지정된윈도우핸들이활성화되었는지여부조사 BOOL EnableWindow(HWND hwnd, BOOL benable bl ); 지정된핸들의윈도우를활성화또는비활성화 benable: TRUE이면활성화, FALSE이면비활성화 BOOL IsWindowVisible(HWND hwnd ); 지정된핸들의윈도우가화면에보이는지여부조사 BOOL ShowWindow(HWND hwnd, int ncmdshow ); 지정된핸들의윈도우를화면에보이게하거나감춤 ncmdshow: SW_SHOW 이면표시, SW_HIDE 이면감춤 BOOL SetWindowText( HWND hwnd, LPCTSTR lpstring ); 지정된핸들의윈도우타이틀을 lpstring 으로표시 int GetWindowText(HWND hwnd, LPTSTR lpstring, int nmaxcount ); 지정된핸들의윈도우타이틀을 lpstring 에저장 순천향대학교컴퓨터학부이상정 18
WCHAR 임베디드 sztemp[1024] 소프트웨어 = L""; LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) switch (message) case WM_LBUTTONDOWN: GetWindowText(hWnd,szTemp,1023); SetWindowText(hWnd,L"Disable for 5 sec."); EnableWindow(hWnd, FALSE); SetTimer(hWnd,1,5000,NULL); SetTimer(hWnd,2,8000,NULL); break; case WM_TIMER: UINT nidevent = (UINT)wParam; if (nidevent == 1) KillTimer(hWnd,1); EnableWindow(hWnd, d TRUE); ShowWindow(hWnd, SW_HIDE); else if (nidevent == 2) KillTimer(hWnd,2); SetForegroundWindow(hWnd); ShowWindow(hWnd, SW_SHOW); SetWindowText(hWnd,szTemp); break; case WM_COMMAND: 순천향대학교컴퓨터학부이상정 19 예제 13: 코드 과제 3(1) 메시지박스에 OK 를누르면 5 초동안윈도우를비활성화하고, Cancel 버튼을누르면 5 초동안윈도우가감춰지는프로그램 순천향대학교컴퓨터학부이상정 20
과제 3(2) 순천향대학교컴퓨터학부이상정 21