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

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

DEV/C C++

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

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

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


Index

  • 윈도우 핸들 뽑기
    • FindWindow
    • FindWindowEx
      • hWndParent
      • hWndChildAfter
      • lpszClass
      • lpszWindow
    • 코드 구현

Script from F.R.I.D.A.Y


윈도우 핸들 뽑기copy^

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

도구 - 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] 기능으로 모든 창 최소화에 반응하지 않는다.

 

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