Что представляет собой функция Aero для предварительного просмотра состояния экрана за окном?

Я везде искал, как использовать Aero в моей программе. Мне не удалось найти ни одной функции C, которая просматривала бы окна за вашими собственными, как, например, File Explorer или любой основной браузер в своих строках заголовка.

Некоторые программы подделывают это, просто добавляя изображение, которое выглядит как строка заголовка Windows 7 - без Aero - но я считаю это своего рода обманом. Я нашел этот код по ссылке ниже:

[DllImport ("dwmapi.dll" Entry Point = "# 113", SetLastError = true)] 

internal static external DwmpActivateLivePreview uint (uint a, IntPtr b, uint c, uint d); 

[DllImport ("dwmapi.dll" Entry Point = "# 105", SetLastError = true)]

internal static bool external DwmpStartOrStopFlip3D (); 

// Activate Aero peek into the desired Handle 
DwmpActivateLivePreview (1, Handle, 0, 1);

// Disable Aero peek
DwmpActivateLivePreview (0, Handle, 0, 1);

// start or stop the Aero Flip 3D
DwmpStartOrStopFlip3D ();

Но понятия не имею, что это значит. Реализация Aero Peek автоматически работает с функцией PreviewWindows(or whatever)?

Я потерялся.

Эта ссылка на голландском языке, просто запустите ее через Google Translate

Я не пытаюсь переключить, активированы ли Aero Peek и / или Flip, или изменить значок для моего приложения, когда мышь наводится на его значок на панели задач. Вместо этого я ищу функцию, которая берет текущее состояние экрана приложений за моим собственным и возвращает его как изображение для отображения в моем приложении. В качестве бонуса, получилось ли (предположительно) возвращаемое изображение размытым или этот эффект применяется отдельно? Думаю, это название - Aero Glass.


person Code Monkey    schedule 04.10.2012    source источник
comment
Я все еще пытаюсь понять, почему все это прекрасно работает на C #, но я не могу хоть как-то работать на C ++ (через LoadLibrary и GetProcAddress).   -  person chris    schedule 04.10.2012
comment
Вы имеете в виду изображения, которые возвращаются, когда вы наводите указатель мыши на их эскизы и когда нажимаете Alt + Tab между окнами?   -  person BoltClock    schedule 28.10.2012
comment
@BoltClock Нет, я считаю, что более точное название того, что я ищу, - Aero Glass.   -  person Code Monkey    schedule 28.10.2012
comment
Ах. Aero Peek - это то, что происходит, когда вы открываете рабочий стол за всеми открытыми окнами, и эти изображения являются окнами предварительного просмотра. Размытая часть оконной рамы действительно является Aero Glass, но я не знаю, есть ли функция, которая возвращает область, покрытую стеклянной областью вашего окна ...   -  person BoltClock    schedule 28.10.2012
comment
Существует программное обеспечение для захвата экрана, которое может захватывать только эти определенные области, но я считаю, что они просто берутся с экрана, когда они были визуализированы (с размытием и цветом окраски окна).   -  person BoltClock    schedule 28.10.2012
comment
@BoltClock Как указать площадь остекления? Я думаю, что Aero сделает все остальное, если область стекла действительно представляет собой прямоугольник, к которому Aero рисует фоновые окна.   -  person Code Monkey    schedule 28.10.2012
comment
В этом я тоже не уверен.   -  person BoltClock    schedule 28.10.2012
comment
msdn.microsoft.com/ en-us / library / windows / desktop /   -  person Hans Passant    schedule 28.10.2012
comment
На самом деле, я думаю, msdn.microsoft.com/en-us/magazine/cc163435. aspx может быть именно тем, что я ищу. Есть ли дополнения к этой статье?   -  person Code Monkey    schedule 28.10.2012
comment
@HansPassant Это еще одна функция включения / выключения, ищу звонок. Однако это было очень полезно. +1.   -  person Code Monkey    schedule 28.10.2012


Ответы (2)


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

HWND hwnd_behind = GetNextWindow(your_window_handle, GW_HWNDNEXT);

HDC hdc = GetWindowDC(hwnd_behind);

RECT rect;
GetWindowRect(hwnd_behind,rect);

HDC bitmap = MakeABitMapDC();

StretchBlt(bitmap,0,0,dW,dH,hdc,0,0,rect.width,rect.height,SRCCOPY);

Вы можете подключить этот код к обработчикам, которые возвращают растровое изображение, когда Windows запрашивает у приложений растровое изображение предварительного просмотра.

Детали вроде «MakeABitMapDC» оставлены для краткости.

person nanda    schedule 31.10.2012
comment
Нет. GetWindowDC, в неавтоматическом режиме, вернет некоторый виртуальный DC, который в основном будет относиться к части экрана, занятой этим окном. Это означает, что если окно 1 находится наверху, а окно 2 находится под ним в том же XY, GetWindowDC обоих окон вернет DC, содержимое которого будет одинаковым - что является содержимым окна 1. - person nanda; 31.10.2012

Я потерялся, это довольно большая область, чтобы увидеть то, чего вы не понимаете, но я все равно попробую.

Если это означает, что вы не знаете, что делают параметры в:

[DllImport ("dwmapi.dll" Entry Point = "# 113", SetLastError = true)] 
internal static external DwmpActivateLivePreview uint (uint a, IntPtr b, uint c, uint d); 

Это в основном так:

  • a: Параметр для активации Aero Peek.
  • b: Ручка также фокусируется на AeroPeek.
  • c: Сложный. Если вы передадите дескриптор окна этому параметру и установлено свойство TopMost, оно появится поверх AeroPeek.
  • d: Понятия не имею, что делает d, но когда я использовал DwmpActivateLivePreview, я всегда ставил его на 1.

Итак, подпись такая:

internal static extern uint DwmpActivateLivePreview(uint active, IntPtr handle, IntPtr onTopHandle, uint d);

Метод DwmpStartOrStopFlip3D активирует эффект «Windows + Tab».

[DllImport("dwmapi.dll", EntryPoint = "#105", SetLastError = true)]
internal static extern bool DwmpStartOrStopFlip3D();

Однако помните, что есть причина, по которой они недокументированы, поскольку они не предназначены для использования нами.

Если вы случайно хотите, чтобы внутри вашего приложения был эффект Aero Peek, вы можете взглянуть на функцию DwmSetIconicLivePreviewBitmap, расположенную в DWM.

Дополнительная информация здесь: MSDN: DwmSetIconicLivePreviewBitmap function

person Rutix    schedule 05.10.2012
comment
Да, недокументированные функции отлично подходят для экспериментов, но, пожалуйста, никогда не используйте их ни в чем, кроме этого. В Windows висит куча мертвого и / или бесполезного кода, потому что им нужно поддерживать работу приложений людей, когда они их не слушают. - person chris; 06.10.2012