F.R.I.D.A.Y.

Win32 - 데스크탑 화면에 윈도우 배치하기 본문

DEV/C C++

Win32 - 데스크탑 화면에 윈도우 배치하기

F.R.I.D.A.Y. 2021. 4. 8. 18:15
반응형

 Windows의 기본 바탕화면에 윈도우를 배치하는 방법입니다.


윈도우 핸들 뽑기

 윈도우 핸들은 Visual Studio 2019의 내장 프로그램인 Spy++를 이용하면 쉽게 뽑을 수 있습니다.

도구 - Spy++ 클릭으로 열 수 있다.

 프로그램 매니저라 불리는 프로세스가 있습니다.

 쌍따옴표로 묶인 문자열은 윈도우 텍스트, 그 옆의 문자열은 윈도우 클래스 이름입니다. 우리는 프로그램을 "FolderView" SysListView32의 하위 윈도우로 구성할 것입니다. 최상위 윈도우. 즉 확장을 하지 않은 WorkerW나 Progman의 경우는 핸들값 없이 찾을 수 있지만, 하위 윈도우를 찾으려 할때는 부모 윈도우의 핸들 값이 필요합니다. 따라서 우리는 FindWindow와 FindWindowEx를 모두 사용할 것입니다.

 

FindWindow

 가장 최상위 부모 윈도우의 핸들을 찾을 때는 이 함수를 사용합니다. 이 함수는 클래스명이나 윈도우 타이틀 이름만 있으면 됩니다.

HWND FindWindowA(
  LPCSTR lpClassName,
  LPCSTR lpWindowName
);

 

FindWindowEx

 FindWindow 함수를 통해 얻은 부모 윈도우 핸들을 기준으로 그 하위 윈도우의 핸들 정보를 알아낼 때 사용할 수 있습니다.

HWND FindWindowExA(
  HWND   hWndParent,
  HWND   hWndChildAfter,
  LPCSTR lpszClass,
  LPCSTR lpszWindow
);

 

hWndParent

 찾을 대상이 포함된 상위 윈도우의 핸들 값입니다.

 

hWndChildAfter

 hWndParent에 포함된 윈도우 중에 어느 윈도우 다음부터 찾을 것인지 지정하는 값입니다.

 

lpszClass

 찾을 윈도우의 클래스 명입니다.

 

lpszWindow

 찾을 윈도우의 제목입니다.

 

 

코드 구현

 이 두 함수를 이용해 코드를 구현하면 다음과 같습니다.

			HWND hDesktop = ::FindWindowExW(
				::FindWindowExW(
					::FindWindow(
						L"Progman", nullptr
					), nullptr, L"SHELLDLL_DefView", nullptr
				), nullptr, L"SysListView32", nullptr
			);

 hDesktop에는 이제 SysListView32를 클래스명으로 가진 윈도우 핸들을 소유하게 됩니다. 이 핸들의 존재 여부를 파악해 다음 함수로 윈도우의 부모를 설정해주면 데스크탑 윈도우의 하위 윈도우로 설정됩니다.

			if (hDesktop) {
				::SetParent(hWnd, hDesktop);
			}

 

 바탕화면의 하위 윈도우로 설정하면 Windows10에서 보이는 윈도우 모습이 아닌 Windows7에서의 윈도우 모습이 보인다. 동시에 해당 윈도우에 포커스가 맞춰져 있더라도 다른 윈도우에 가리는 것을 볼 수 있다.

  • 포커스를 가지고 있어도 상단으로 노출되지 않는다.
  • 작업표시줄에 아이콘이 발생하지 않는다
  • 바탕화면보기[# Win + D] 기능으로 모든 창 최소화에 반응하지 않는다.

 

# index

728x90
반응형

'DEV > C C++' 카테고리의 다른 글

원의 충돌 판정  (0) 2021.05.08
사각형의 충돌 판정  (0) 2021.05.07
GetWindowRect vs GetClientRect  (0) 2021.04.07
Win32 MainWindow Class 생성하기  (0) 2021.04.05
Win32 BaseWindow Class 생성하기  (0) 2021.04.05
Comments