일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 함수
- 프로그래밍
- 연산자
- VS ERROR
- 배열
- c
- Desktop
- Kotlin
- c++
- 문법
- tipssoft
- 백준
- 리뷰
- Programming
- 이지스퍼블리싱
- 포인터
- 지식나눔강좌
- Javascript
- 알고리즘
- Win32
- Tips강좌
- CS
- Direct2D
- doit코틀린프로그래밍
- 티스토리
- Tips프로그래밍강좌
- 김성엽
- Visual Studio
- c#
- Windows
- Yesterday
- Today
- Total
F.R.I.D.A.Y.
Win32 - 데스크탑 화면에 윈도우 배치하기 본문

Windows의 기본 바탕화면에 윈도우를 배치하는 방법입니다.
Index
- 윈도우 핸들 뽑기
- FindWindow
- FindWindowEx
- hWndParent
- hWndChildAfter
- lpszClass
- lpszWindow
- 코드 구현
윈도우 핸들 뽑기copy^
윈도우 핸들은 Visual Studio 2019의 내장 프로그램인 Spy++를 이용하면 쉽게 뽑을 수 있습니다.


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

쌍따옴표로 묶인 문자열은 윈도우 텍스트, 그 옆의 문자열은 윈도우 클래스 이름입니다. 우리는 프로그램을 "FolderView" SysListView32의 하위 윈도우로 구성할 것입니다. 최상위 윈도우. 즉 확장을 하지 않은 WorkerW나 Progman의 경우는 핸들값 없이 찾을 수 있지만, 하위 윈도우를 찾으려 할때는 부모 윈도우의 핸들 값이 필요합니다. 따라서 우리는 FindWindow와 FindWindowEx를 모두 사용할 것입니다.
FindWindowcopy^
가장 최상위 부모 윈도우의 핸들을 찾을 때는 이 함수를 사용합니다. 이 함수는 클래스명이나 윈도우 타이틀 이름만 있으면 됩니다.
HWND FindWindowA(
LPCSTR lpClassName,
LPCSTR lpWindowName
);
FindWindowExcopy^
FindWindow 함수를 통해 얻은 부모 윈도우 핸들을 기준으로 그 하위 윈도우의 핸들 정보를 알아낼 때 사용할 수 있습니다.
HWND FindWindowExA(
HWND hWndParent,
HWND hWndChildAfter,
LPCSTR lpszClass,
LPCSTR lpszWindow
);
hWndParentcopy^
찾을 대상이 포함된 상위 윈도우의 핸들 값입니다.
hWndChildAftercopy^
hWndParent에 포함된 윈도우 중에 어느 윈도우 다음부터 찾을 것인지 지정하는 값입니다.
lpszClasscopy^
찾을 윈도우의 클래스 명입니다.
lpszWindowcopy^
찾을 윈도우의 제목입니다.
코드 구현copy^
이 두 함수를 이용해 코드를 구현하면 다음과 같습니다.
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에서의 윈도우 모습이 보인다. 동시에 해당 윈도우에 포커스가 맞춰져 있더라도 다른 윈도우에 가리는 것을 볼 수 있다.
- 포커스를 가지고 있어도 상단으로 노출되지 않는다.
- 작업표시줄에 아이콘이 발생하지 않는다
- 바탕화면보기[1] 기능으로 모든 창 최소화에 반응하지 않는다.
'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 |