(Этот вопрос основан на дальнейших исследованиях этого другого вопроса, но это не тот же вопрос, это очень конкретный вопрос о проблемах с живописью.)
Я пытаюсь нарисовать прозрачную поверхность, наложенную на целевое окно, проблема в том, что я не знаю, как нарисовать ее прозрачно, поэтому к моменту, когда моя поверхность черная, и я не вижу правильного пути к очистите черный цвет этой поверхности в коде ниже.
Я читал о пиксельных форматах и альфа-методах, однако, кажется, я не могу использовать AlphaMode.Straight
, который якобы предназначен для прозрачности.
Я знаю бесплатное приложение, которое может это сделать, его имя TurboHUD ( приложение, которое рисует прозрачную поверхность в окне игрового клиента для рисования объектов, то есть HUD). Если честно и, может быть, смешно: я пытаюсь это сделать более двух лет назад, я до сих пор не знаю, как начать делать это, выполняя прозрачность, необходимую мне для рисования объектов на прозрачной поверхности.
Что я делаю неправильно? Этот пример кода написан на VB.NET, но я тоже принимаю решение на С#.
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 принятого ответа на вопрос .