Что нового

Как клонировать рабочий стол на форму (не скриншот !) ?

VladUs

Скриптер
Сообщения
621
Репутация
180
Дано: Форма
Задача: Необходимо дублировать картинку на экране в форму

Накидал примерный скрипт:

Код:
#include <WindowsConstants.au3>
#include <WinAPI.au3>
#Include <WinAPIEx.au3>

Opt("GUICloseOnESC", 0)
HotKeySet("{ESC}", "_Exit")
Global $GUI, $hGuiDC, $hDeskDC
WinMinimizeAll()
; Создаем  GUI
$GUI = GUICreate("FORM", @DesktopWidth /2, @DesktopHeight, 0, 0, $WS_POPUP)
GUISetState(@SW_SHOW)
;$Получаем Handle $GUI
$hGUI = WinGetHandle("FORM")
; Получаем device context для   $GUI
$hDC = _WinAPI_GetDC($hGUI)

; Получаем Handle рабочего стола
$hDesk =  _WinAPI_GetDesktopWindow()
; Получаем device context для Рабочего стола
$hDeskDC = _WinAPI_GetDC($hDesk)

If @error Then
    _WinAPI_ReleaseDC($hGUI, $hDC)
    Exit
 EndIf
 
 Run("Explorer.Exe")
; Копируем картинку рабочего стола в наше $GUI
While 1
	Sleep(100)
	_WinAPI_StretchBlt ( $hDC, 0, 0, 1920, 1080, $hDeskDC, 960, 0, 1920, 1080, $SRCCOPY )
WEnd

Func _Exit()
    _WinAPI_ReleaseDC(0, $hDeskDC)
    _WinAPI_ReleaseDC($hGUI, $hDC)
    GUIDelete($hGUI)
    Exit
EndFunc


В сущности получилось, то что происходит на одной половине монитора дублируется на другой половине. Но вот почему не отображаются значки рабочего стола и панель задач не могу понять.

Внимание:В вышеуказанном скрипте, параметры указанные в функции _WinAPI_StretchBlt(), применимы для моего монитора. Возможно, для корректного отображения с другим разрешением экрана, Вам необходимо будет изменить данные параметры в этой функции.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
361
VladUs
А можно сделать, чтобы на форме изображение стола было зеркальным?
 
Автор
V

VladUs

Скриптер
Сообщения
621
Репутация
180
madmasles [?]
У меня значки отображаются.
А почему у меня не отображаются ? :(

У меня отображаются значки если
Код:
$hDeskDC = _WinAPI_GetDC(WinGetHandle("[Class:Progman]"))

Но тогда остальные действия не дублируются типа открытия папок и т. п

А зачем $hGUI = WinGetHandle("FORM")?
В сущности Вы правы это лишнее, достаточно было и $GUI. Но пусть уже так остается...
 

joiner

Модератор
Локальный модератор
Сообщения
3 320
Репутация
567
у меня при запуске скрипта запускается проводник (explorer)
а за ним вот так

получается что видна только правая часть экрана
 
Автор
V

VladUs

Скриптер
Сообщения
621
Репутация
180
Немного подредактировал код. Теперь, с отображением всего рабочего стола на форме, все нормально, за исключение того , что на форму теперь проецируется несколько рабочих столов вложенных друг в друга.
Кто может подсказать как этого избежать ? :wacko:

Код:
#include <WindowsConstants.au3>
#include <WinAPI.au3>
#Include <WinAPIEx.au3>

Opt("GUICloseOnESC", 0)
HotKeySet("{ESC}", "_Exit")
Global $GUI, $hGuiDC, $hDeskDC
WinMinimizeAll()
; Создаем  GUI
$GUI = GUICreate("FORM",800 ,600, 0, 0, $WS_POPUP)
GUISetState(@SW_SHOW)
;$Получаем Handle $GUI
$hGUI = WinGetHandle("FORM")
; Получаем device context для   $GUI
$hDC = _WinAPI_GetDC($hGUI)

; Получаем Handle рабочего стола
$hDesk =  _WinAPI_GetDesktopWindow()
; Получаем device context для Рабочего стола
$hDeskDC = _WinAPI_GetDC($hDesk)
If @error Then
    _WinAPI_ReleaseDC($hGUI, $hDC)
    Exit
 EndIf

 Run("Explorer.Exe")
; Копируем картинку рабочего стола в наше $GUI
While 1
	Sleep(100)
	_WinAPI_StretchBlt ( $hDC, 0, 0, 800, 600, $hDeskDC, 0, 0, @DesktopWidth, @DesktopHeight,$SRCCOPY )
   ;_WinAPI_BitBlt($hDC, 0, 0, 800, 600, $hDeskDCC, 100, 500, $SRCCOPY )
   
WEnd

Func _Exit()
    _WinAPI_ReleaseDC(0, $hDeskDC)
    _WinAPI_ReleaseDC($hGUI, $hDC)
    GUIDelete($hGUI)
    Exit
EndFunc


Специалисты по GDI прошу откликнуться.
 
Верх