Game Dev/Article

Minimize All Windows

AKer 2009. 4. 30. 21:30
반응형
어떠한 프로그램을 실행시킬 때 해당 프로그램의 점유율을 조금이라도 높여주기 위해 혹은 그 외의 이유로 다른 프로그램을 최소화 할 때가 있다. 여러가지 접근 방법들이 존재하겠지만, 쉽게 구현할 수 있는 몇가지 방법들에 대해서 정리해 보도록하겠다.

1. 윈도우 이벤트 발생
- 장점 : 빠르고 쉽게 구현이 가능하다.
- 단점 : 단점은 딱히 없는것 같다 아직 발견하지 못하였다.
// "Window Key + D" Event
keybd_event(VK_LWIN, 0, 0, 0);
keybd_event('D', 0, 0, 0); // Choose Win+D or Win+M 
keybd_event('D', 0, KEYEVENTF_KEYUP, 0);
keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP, 0);

2. Enum Window
- 장점 : 특수한 윈도우 핸들에 대해서 Skip이 가능하다. 
- 단점 : Callback에 시간이 오래 걸리며 Minimize하는 과정이 눈으로 식별될 정도로 느리다.
// Enum Window
static BOOL CALLBACK HideAllWindowsProc(HWND hWnd, LPARAM lParam)
{
	if (IsWindowVisible(hWnd) && GetWindowTextLength(hWnd))
	{
		char szText[MAX_PATH] = {0,};
		GetWindowTextA(hWnd, szText, MAX_PATH);

		ShowWindow(hWnd, SW_MINIMIZE);
	}

	return TRUE;
}

EnumWindows(HideAllWindowsProc, NULL);

3. 바탕 화면 보기 이용
- 장점 : 구현이 쉽고 간단하다.
- 단점 : 해당 파일이 없거나 언어별로 이름이 다를 수 있으므로 파일을 배포하는 것이 안전하다.
// Shell Execute 
#include <shellapi.h>

ShellExecute(NULL, "open", " 바탕 화면 보기.scf", NULL, NULL, SW_HIDE);

4. Shell Dll 이용
- 장점 : "바탕 화면 보기"를 누른 것과 정확히 같은 기능을 한다. (MSDN 인용)
- 단점 : 구현이 비교적 번거롭다.
#include <shldisp.h>

if (FAILED(CoInitialize(NULL)))
	return;

IShellDispatch* pDisp = NULL;
HRESULT hr = CoCreateInstance(CLSID_Shell, NULL, CLSCTX_INPROC_SERVER, IID_IShellDispatch, (void**)&pDisp);

if (SUCCEEDED(hr))
{
	pDisp->MinimizeAll();
	// pDisp->UndoMinimizeALL();

	pDisp->Release();
}

CoUninitialize();

※ 창이 최소화 되는 시간이 있기 때문에, Sleep을 주거나 윈도우 생성 시기를 늦추는 등 동기화에 많은 신경을 써야한다.


반응형