(Этот вопрос основан на дальнейших исследованиях этот другой вопрос, но это не тот же вопрос, это очень конкретный вопрос о проблемах с покраской.)
Я пытаюсь нарисовать прозрачную поверхность, наложенную на целевое окно, проблема в том, что я не знаю, как нарисовать ее прозрачной, поэтому к тому моменту, когда моя поверхность стала черной, я не вижу, как правильно очистить черный цвет этой поверхности в коде ниже.
Я читал о форматах пикселей и альфа-режимах, однако, похоже, я не могу использовать AlphaMode.Straight
, который якобы предназначен для обеспечения прозрачности.
Мне известно о бесплатном приложении, которое может это сделать, его имя TurboHUD (приложение, которое рисует прозрачную поверхность в окне игрового клиента для рисования объектов, то есть HUD). Если честно и, возможно, смешно: я пытаюсь достичь этого более двух лет назад, я до сих пор не знаю, как начать делать это, делая прозрачность, которая мне нужна, чтобы начать рисовать объекты на прозрачной поверхности.
Что я делаю не так ?. Этот пример кода написан на VB.NET, но я тоже принимаю решение на C #.
Imports SharpDX
Imports SharpDX.Direct2D1
Imports SharpDX.Direct3D
Imports SharpDX.DXGI
Imports SharpDX.Mathematics.Interop
Imports SharpDX.Windows
Public NotInheritable Class Form1 : Inherits Form
Private factory As New Direct2D1.Factory(Direct2D1.FactoryType.SingleThreaded)
Private render As WindowRenderTarget
Private renderProps As HwndRenderTargetProperties
Private renderThread As Thread = Nothing
Private Sub Form1_Load() Handles MyBase.Shown
Dim hwnd As IntPtr = Process.GetProcessesByName("notepad").Single().MainWindowHandle
Me.renderProps = New HwndRenderTargetProperties()
Me.renderProps.Hwnd = hwnd
Me.renderProps.PixelSize = New Size2(1920, 1080)
Me.renderProps.PresentOptions = PresentOptions.None
Me.render = New WindowRenderTarget(Me.factory, New RenderTargetProperties(New PixelFormat(Format.B8G8R8A8_UNorm, Direct2D1.AlphaMode.Premultiplied)), Me.renderProps)
Me.renderThread = New Thread(New ParameterizedThreadStart(AddressOf Me.DoRender))
Me.renderThread.Priority = ThreadPriority.Normal
Me.renderThread.IsBackground = True
Me.renderThread.Start()
End Sub
Private Sub DoRender(ByVal sender As Object)
While True
Me.render.BeginDraw()
' Me.render.Clear(New RawColor4(0, 0, 0, 0))
Me.render.Clear(SharpDX.Color.Transparent)
Me.render.Flush()
Me.render.EndDraw()
End While
End Sub
End Class
Приведенный выше код представляет собой адаптацию VB.NET принятого ответа this вопрос.
Straight
альфа-режим не поддерживается при работе сID2D1HwndRenderTarget
интерфейсом (который, я полагаю, использует SharpDX). - person Visual Vincent   schedule 29.06.2016DwmExtendFrameIntoClientArea
с правильным размером в соответствующей структуре margins, и я все еще вижу черный фон в целевом окне. Используемый мной тип рендеринга hwnd, похоже, не имеет опции / свойства для установки цвета по умолчанию ... или я не могу его найти, поэтому я не могу проверить, что цвет черный, но я пытаюсь очистить черный цвет, чтобы увидеть черную поверхность. - person ElektroStudios   schedule 01.07.2016ID2D1BitmapRenderTarget
илиID2D1RenderTarget
вместо этого, тогда конструкторы класса оболочки SharpDX (BitmapRenderTarget
andWicRenderTarget
я полагаю) принимает в качестве параметра другой (базовый )RenderTarget
class !!, поэтому я пытаюсь создать экземпляр класса, который наследуется отRenderTarget
, но его конструктор запрашивает у меня другой экземплярRenderTarget
? Я этого не понимаю; также я могу передать собственный указатель, но я не знаю, что он означает в этом значении DirectX. Я полностью потерялся. - person ElektroStudios   schedule 01.07.2016ID2D1HwndRenderTarget
. В VB.NET/C# это будетIntPtr
. - person Visual Vincent   schedule 01.07.2016