WM_ACTIVATEAPP

인수

wParam : 이 인수가 TRUE이면 윈도우가 활성화된 것이고 FALSE이면 비활성화된 것이다.

lParam : 이 윈도우가 활성/비활성화됨에 따라 활성화 여부가 반대로 바뀌는 다른 윈도우의 스레드 ID가 전달된다. 예를 들어 A윈도우에서 B윈도우로 활성 윈도우가 바뀌었을 때 A윈도우는 이 메시지의 lParam으로 B윈도우의 스레드 ID를 받고 반대로 B윈도우의 이 메시지는 A윈도우의 스레드 ID를 받는다. 활성화 상태가 바뀐 상대편 윈도우에 대해 어떤 처리를 하고 싶으면 이 인수를 참조한다.

설명

다른 프로세스에 소속된 윈도우로 활성 상태가 이동될 때 이 메시지가 발생한다. 이 메시지는 새로 활성화되는 윈도우와 비활성화되는 윈도우에 동시에 전달된다. 그러나 같은 프로세스내의 윈도우로 포커스가 이동할 때는 이 메시지가 발생하지 않으며 WM_ACTIVATE 메시지가 대신 발생한다. 응용 프로그램 전체의 활성 상태를 프로그래밍할 때만 이 메시지를 사용하며 윈도우 단위의 활성화는 WM_ACTIVATE 메시지를 대신 사용한다.

리턴

이 메시지를 처리했으면 0을 리턴한다.

예제

다음 예제는 활성화되어 있는 동안 애니메이션을 진행하며 비활성화 되면 애니메이션을 중지한다.

예제 1

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	char *arStr[]={"animation    ","애니메이션  "};
	static int count;

	switch(iMessage) {
	case WM_CREATE:
		return 0;
	case WM_ACTIVATEAPP:
		if (wParam == TRUE) {
			SetTimer(hWnd,1,500,NULL);
		} else {
			KillTimer(hWnd,1);
			hdc=GetDC(hWnd);
			TextOut(hdc,10,10,"잠시중지      ",14);
			ReleaseDC(hWnd,hdc);
		}
		return 0;
	case WM_TIMER:
		count++;
		hdc=GetDC(hWnd);
		TextOut(hdc,10,10,arStr[count%2],lstrlen(arStr[count%2]));
		ReleaseDC(hWnd,hdc);
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

응용 프로그램이 활성화 될 때 타이머를 설치하여 애니메이션을 하도록 하며 비활성화될 때는 타이머를 파괴함과 동시에 애니메이션이 중지되었음을 출력한다. 실행중의 모습은 다음과 같다.

예제 2

다음 예제는 세 개의 팝업 윈도우를 거느리고 있는데 부모 윈도우가 활성화 상태일 때만 팝업 윈도우가 나타나며 비활성화되면 팝업 윈도우를 숨긴다.

#include <windows.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
LRESULT CALLBACK ChildProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam);
HINSTANCE g_hInst;
HWND hWndMain;
LPCTSTR lpszClass=TEXT("WM_ACTIVATEAPP2");

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
	  ,LPSTR lpszCmdParam,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)WndProc;
	WndClass.lpszClassName=lpszClass;
	WndClass.lpszMenuName=NULL;
	WndClass.style=CS_HREDRAW | CS_VREDRAW;
	RegisterClass(&WndClass);

	WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
	WndClass.hbrBackground=NULL;
	WndClass.lpfnWndProc=(WNDPROC)ChildProc;
	WndClass.lpszClassName="ChildCls";
	WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
	RegisterClass(&WndClass);

	hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,
		10,210,590,100,
		NULL,(HMENU)NULL,hInstance,NULL);
	ShowWindow(hWnd,nCmdShow);
	hWndMain=hWnd;
	
	while(GetMessage(&Message,0,0,0)) {
		TranslateMessage(&Message);
		DispatchMessage(&Message);
	}
	return (int)Message.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	TCHAR Mes[]="활성 상태일 때만 팝업 윈도우를 보여준다.";
	static HWND hP1,hP2,hP3;

	switch(iMessage) {
	case WM_CREATE:
		hP1=CreateWindow("ChildCls","팝업1",WS_POPUP | WS_VISIBLE | WS_CAPTION,
			10,10,190,190,hWnd,(HMENU)NULL,g_hInst,NULL);
		hP2=CreateWindow("ChildCls","팝업2",WS_POPUP | WS_VISIBLE | WS_CAPTION,
			210,10,190,190,hWnd,(HMENU)NULL,g_hInst,NULL);
		hP3=CreateWindow("ChildCls","팝업3",WS_POPUP | WS_VISIBLE | WS_CAPTION,
			410,10,190,190,hWnd,(HMENU)NULL,g_hInst,NULL);
		return 0;
	case WM_ACTIVATEAPP:
		ShowWindow(hP1,wParam==TRUE ? SW_SHOW : SW_HIDE);
		ShowWindow(hP2,wParam==TRUE ? SW_SHOW : SW_HIDE);
		ShowWindow(hP3,wParam==TRUE ? SW_SHOW : SW_HIDE);
		return 0;
	case WM_PAINT:
		hdc=BeginPaint(hWnd, &ps);
		TextOut(hdc,10,10,Mes,lstrlen(Mes));
		EndPaint(hWnd, &ps);
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

LRESULT CALLBACK ChildProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

부모 윈도우의 활성화 상태가 변경될 때마다 WM_ACTIVATEAPP 메시지가 전달되므로 이 메시지에서 팝업 윈도우를 숨기거나 보이도록 하였다. 많은 팝업 윈도우를 거느리고 있는 응용 프로그램은 자신이 사용되지 않을 때 팝업 윈도우를 숨기거나 최소화하여 다른 응용 프로그램이 화면 영역을 많이 사용할 수 있도록 양보해 주어야 한다.

플랫폼

95이상

참조

WM_ACTIVATE


written by http://www.winapi.co.kr