Stores the display affinity setting in kernel mode on the specified window
#include <WinAPISysWin.au3>
_WinAPI_SetWindowDisplayAffinity ( $hWnd, $iAffinity )
$hWnd | Handle to the window. |
$iAffinity | The display affinity setting. This setting specifies where the window's contents are can be displayed. Set this value to $WDA_MONITOR to display the window's contents only on a monitor. Set this value to $WDA_NONE to remove the monitor-only affinity. |
Success: | True. |
Failure: | False. |
_WinAPI_SetWindowDisplayAffinity() are designed to support the window content protection. This functions
enables applications to protect their own onscreen window content from being captured or copied through a specific
set of public operating system features and APIs. However, it works only when the Desktop Window Manager(DWM)
is composing the desktop.
This function requires Windows 7 or later.
Search SetWindowDisplayAffinity in MSDN Library.
#include <APIGdiConstants.au3>
#include <APISysConstants.au3>
#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>
#include <ScreenCapture.au3>
#include <SendMessage.au3>
#include <StaticConstants.au3>
#include <WinAPIGdi.au3>
#include <WinAPIGdiDC.au3>
#include <WinAPIHObj.au3>
#include <WinAPISys.au3>
#include <WinAPISysWin.au3>
#include <WindowsConstants.au3>
If (Number(_WinAPI_GetVersion()) < 6.1) Or (Not _WinAPI_DwmIsCompositionEnabled()) Then
MsgBox(($MB_ICONERROR + $MB_SYSTEMMODAL), 'Error', 'Require Windows 7 or later with enabled Aero theme.')
Exit
EndIf
Global $g_iWidth = @DesktopWidth / 2, $g_iHeight = @DesktopHeight / 2
Local $hForm = GUICreate('Test ' & StringReplace(@ScriptName, '.au3', '()'), $g_iWidth + 116, $g_iHeight + 51)
GUICtrlCreatePic('', 14, 14, $g_iWidth + 2, $g_iHeight + 2, -1, $WS_EX_STATICEDGE)
GUICtrlSetState(-1, $GUI_DISABLE)
Global $g_hPic = GUICtrlGetHandle(-1)
Local $idCheck = GUICtrlCreateCheckbox('Protect against capture of window', 14, $g_iHeight + 23, 182, 21)
Local $idButton = GUICtrlCreateButton('Capture', $g_iWidth + 29, 13, 74, 25)
GUICtrlSetState(-1, BitOR($GUI_DEFBUTTON, $GUI_FOCUS))
GUISetState(@SW_SHOW)
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
ExitLoop
Case $idButton
_Capture()
Case $idCheck
If GUICtrlRead($idCheck) = $GUI_CHECKED Then
_WinAPI_SetWindowDisplayAffinity($hForm, $WDA_MONITOR)
Else
_WinAPI_SetWindowDisplayAffinity($hForm, 0)
EndIf
EndSwitch
WEnd
Func _Capture()
Local $hObj = _SendMessage($g_hPic, $STM_SETIMAGE, 0, 0)
If $hObj Then
_WinAPI_DeleteObject($hObj)
EndIf
Local $hDC = _WinAPI_GetDC($g_hPic)
Local $hDestDC = _WinAPI_CreateCompatibleDC($hDC)
Local $hBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $g_iWidth, $g_iHeight)
Local $hDestSv = _WinAPI_SelectObject($hDestDC, $hBitmap)
Local $hSrcDC = _WinAPI_CreateCompatibleDC($hDC)
$hObj = _ScreenCapture_Capture('', 0, 0, -1, -1, 0)
Local $hSrcSv = _WinAPI_SelectObject($hSrcDC, $hObj)
_WinAPI_SetStretchBltMode($hDestDC, $HALFTONE)
_WinAPI_StretchBlt($hDestDC, 0, 0, $g_iWidth, $g_iHeight, $hSrcDC, 0, 0, @DesktopWidth, @DesktopHeight, $SRCCOPY)
_WinAPI_ReleaseDC($g_hPic, $hDC)
_WinAPI_SelectObject($hDestDC, $hDestSv)
_WinAPI_DeleteDC($hDestDC)
_WinAPI_SelectObject($hSrcDC, $hSrcSv)
_WinAPI_DeleteObject($hObj)
_WinAPI_DeleteDC($hSrcDC)
_SendMessage($g_hPic, $STM_SETIMAGE, 0, $hBitmap)
$hObj = _SendMessage($g_hPic, $STM_GETIMAGE)
If $hObj <> $hBitmap Then
_WinAPI_DeleteObject($hBitmap)
EndIf
EndFunc ;==>_Capture