Отрисовка графики с альфа-смешением на рабочем столе с помощью Direct2D

Я создаю пользовательский интерфейс, используя чистый Direct2D и C # с SharpDX. Этот пользовательский интерфейс должен быть удобным и красивым, но при этом эффективным.

Панель инструментов Direct2D

Для демонстрации я создал прототип с использованием хакерских недокументированных API (см. этот вопрос), но я никоим образом не собираюсь с этим работать, поскольку обратная совместимость является первой и главной причиной:

var accent = new User32.AccentPolicy { AccentState = AccentState };
int accentStructSize = Marshal.SizeOf(accent);

// allocate space for the struct
IntPtr accentPtr = Marshal.AllocHGlobal(accentStructSize);
Marshal.StructureToPtr(accent, accentPtr, false);

// set composition data
var data = new User32.WindowCompositionAttributeData {
  Attribute = User32.WindowCompositionAttribute.WCA_ACCENT_POLICY,
  SizeOfData = accentStructSize,
  Data = accentPtr
};

// change window composition attributes and release resources
User32.SetWindowCompositionAttribute(Handle, ref data);
Marshal.FreeHGlobal(accentPtr);

Я знаю, что мгновенным ответом на это будет использование WPF, но я довольно ограничен необработанными вызовами Direct2D, так как я намереваюсь переместить всю логику пользовательского интерфейса в DLL для внедрения в приложения DirectX ( который, хотя и не уверен, как я собираюсь это сделать, выходит за рамки этого вопроса.)

В Windows 8.1 существует DirectComposition, который обеспечивает эффективное наложение альфа-канала поверх прозрачных окон.

Но в Windows Vista и 7 такого нет (даже с обновлением платформы).

Есть ли способ использовать чистый код Direct2D/DirectX без хакерского кода, чтобы этот пользовательский интерфейс работал во всех версиях Windows (предпочтительно Vista SP2 и выше)?


person Community    schedule 15.02.2018    source источник
comment
Желательно, чтобы вы могли публиковать отдельные вопросы, а не объединять их в один. Таким образом, это поможет людям, отвечающим на ваш вопрос, а также тем, кто ищет хотя бы один из ваших вопросов. Спасибо!   -  person Jake Symons    schedule 16.02.2018
comment
@JakeSymons, спасибо за отзыв. Я отредактировал вопрос и задам остальные в зависимости от ответов на этот вопрос.   -  person    schedule 16.02.2018
comment
Есть SharpDX.Direct3D11.BlendStateDescription для смешивания при рендеринге различных текстур (соответствует D3D11_BLEND_DESC) — это будет то, что вы будете использовать, если перехватите рендеринг приложения DirectX как текстуру, а затем выполните повторный рендеринг в окно (перехват возможен, но это хак). Это не мой опыт, но похоже, что SetLayeredWindowAttributes позволяет вам установить непрозрачность окна, если вы хотите создать окно, которое следует за приложением, которое вы подключаете, но не быть полностью непрозрачным. Это менее хакерски, поскольку вам не нужно перехватывать вызовы рендеринга исходного приложения.   -  person NextInLine    schedule 21.02.2018