IT 알쓸신잡

Qt 화면 녹화 & 캡쳐 방지 본문

Development

Qt 화면 녹화 & 캡쳐 방지

솦트웰러 2023. 2. 22. 18:11
728x90
반응형

Windows API 함수 중에 SetWindowDisplayAffinity 함수가 있습니다.

 

SetWindowDisplayAffinity function (winuser.h) - Win32 apps | Microsoft Learn

 

SetWindowDisplayAffinity function (winuser.h) - Win32 apps

Stores the display affinity setting in kernel mode on the hWnd associated with the window.

learn.microsoft.com

 

Microsoft 개발자 문서를 참고하면, 첫번째 인자는 윈도우 핸들 / 두번째 인자는 옵션 / 결과는 bool 형태로 리턴됩니다.

BOOL SetWindowDisplayAffinity(
  [in] HWND  hWnd,
  [in] DWORD dwAffinity
);

 

첫번째 인자인 윈도우 핸들은,

A handle to the top-level window. The window must belong to the current process.

최상위 핸들이어야 하고, 이 함수를 사용하는 건 같은 프로세스 내에서만 사용이 가능하다고 하는군요.

 

두번째 인자인 dwAffinity를 확인해 보면,

  • WDA_NONE : 녹화 & 캡쳐 방지 해제
  • WDA_MONITOR : 녹화 & 캡쳐 방지 적용 ( 녹화 & 캡쳐 시 창 내부가 검은색으로 나옴)
  • WDA_EXCLUDEFROMCAPTURE : 녹화 & 캡쳐 방지 적용 ( 창이 아예 안보임, Windows 10 이후)

 

이 함수를 Qt 에 적용해서 사용해 보도록 하겠습니다.

 

1. 프로젝트를 생성 후 .pro 파일에서 함수를 사용하기 위한 라이브러리를 추가합니다.

LIBS += -luser32 \
        -lgdi32

 

2.  헤더 파일을 로드 합니다.

#include <Windows.h>	//Qt에서 윈도우 관련 헤더
#include "WinUser.h"

 

3. 함수 사용

    HWND hwnd = reinterpret_cast<HWND>(this->winId()); 
    if(hwnd == NULL )	qDebug() << "hwnd null~~~";
    bool ret = SetWindowDisplayAffinity(hwnd, WDA_MONITOR);
    qDebug() << "result : " << ret;
  • 첫번째 줄 : 현재 dialog(widget)의 winId를 Windows API HWND 변수로 형변환.
  • 두번째 줄 : HWND 변수가 null일 경우 디버깅
  • 세번째 줄 : SetWindowDisplayAffinity 함수 호출
  • 네번째 줄 : 함수 호출 결과 확인

윈도우 핸들에 대한 형변환만 주의하면 사용법은 되게 쉽습니다.

 

적용 결과

Push 버튼 두 개를 추가하여 녹화&캡쳐 방지 사용 / 해제가 되도록 간단하게 프로그램 했습니다.

사용 시에는 검은색으로 방지가 되며 해제 시에는 캡쳐가 됩니다. 스크린 녹화 시에도 동일합니다.

 

이번엔 child dialog를 만들어서 적용이 되는지 확인해 봤습니다.

child dialog에서도 잘 적용이 되는군요~~~

 

하지만 중요한 제한 사항이 있습니다!!

아래 함수는 Qt에서 윈도우의 Attribute를 투명으로 설정하는 함수입니다.

setAttribute(Qt::WA_TranslucentBackground);

투명을 적용할 경우 SetWindowDisplayAffinity 함수가 적용이 안되며 false를 리턴합니다..

 

커스텀 모양의 윈도우를 만들 경우에는 사용이 안되겠군요ㅠㅠ

 

이 부분을 유념하여 내가 만든 프로그램에 녹화&캡쳐 방지를 잘 활용하도록 합시다^^

728x90
반응형
Comments