Как нарисовать прозрачную поверхность с помощью SharpDX?

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

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

Я читал о pixelformats и alphamodes, однако, кажется, я не могу использовать 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 адаптация принятого ответа этой вопрос.

1 ответов


Спасибо большое @δ γηράσκω' πολλά αεί διδασκόμε предложения, я наконец-то вошли в Сделать это с помощью SharpDx.

код ниже содержит некоторые вызовы внешней библиотеки, однако я думаю, что идея будет очень ясной.

как @δ γηράσκω' πολλά αεί διδασκόμε сказал, чтобы использовать WindowRenderTarget Кажется, что мне нужно использовать его в моей собственной форме, и моя форма должна удовлетворять этим условиям:

  • черный цвет фона.
  • быть формой без границ.
  • быть самым верхним окном (очевидно).
  • оконная рама должна быть расширена в клиентскую область, вызвав DwmExtendFrameIntoClientArea