Nicht auf einer Form sondern außerhalb einer Form zeichnen (Multiple Screen)

  • VB.NET
  • .NET (FX) 4.0

Es gibt 31 Antworten in diesem Thema. Der letzte Beitrag () ist von Drahuverar.

    Damit das mit dem einblenden und ausblenden der Form ein wenig schoener aussieht, kannst du ja auch noch AnimateWindow nutzen. ^^

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Public Class Form1
    3. <DllImport("user32.dll")> _
    4. Shared Function AnimateWindow(ByVal hwnd As IntPtr, ByVal time As Integer, ByVal flags As AnimateWindowFlags) As Boolean
    5. End Function
    6. <Flags()> _
    7. Public Enum AnimateWindowFlags
    8. AW_HOR_POSITIVE = &H1
    9. AW_HOR_NEGATIVE = &H2
    10. AW_VER_POSITIVE = &H4
    11. AW_VER_NEGATIVE = &H8
    12. AW_CENTER = &H10
    13. AW_HIDE = &H10000
    14. AW_ACTIVATE = &H20000
    15. AW_SLIDE = &H40000
    16. AW_BLEND = &H80000
    17. End Enum
    18. Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    19. AnimateWindow(Handle, 1000, AnimateWindowFlags.AW_HIDE Or AnimateWindowFlags.AW_BLEND)
    20. End Sub
    21. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    22. AnimateWindow(Handle, 1000, AnimateWindowFlags.AW_BLEND)
    23. End Sub
    24. End Class
    And i think to myself... what a wonderfuL World!
    @Drahuverar Hat jetzt ein wenig länger gedauert.
    Mit EnumDisplayDevices() kannst Du Dir die Namen der Devices auslesen. Dazu brauchst Du noch die Struktur DISPLAY_DEVICE und das Enumber DisplayDeviceStateFlags.
    Dies als Hilfsmittel bekomme ich \\.\DISPLAY2 als Namen meines zweiten Screens angezeigt (Button2_Click).

    VB.NET-Quellcode

    1. DisplayCross("DISPLAY")
    2. DisplayCross("\\.\DISPLAY2")
    malt mir dann XX auf beide Bildschirme.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. 'http://pinvoke.net/default.aspx/user32/EnumDisplayDevices.html
    3. Public Class Form1
    4. <DllImport("gdi32.dll", SetLastError:=True, CharSet:=CharSet.Ansi)> _
    5. Public Shared Function CreateDC(<MarshalAs(UnmanagedType.LPStr)> lpszDriver As String, _
    6. <MarshalAs(UnmanagedType.LPStr)> lpszDevice As String, _
    7. <MarshalAs(UnmanagedType.LPStr)> lpszOutput As String, _
    8. lpInitData As IntPtr) As IntPtr
    9. End Function
    10. <DllImport("user32.dll")>
    11. Private Shared Function ReleaseDC(ByVal hWnd As IntPtr, ByVal hDC As IntPtr) As Boolean
    12. End Function
    13. <DllImport("user32.dll", EntryPoint:="EnumDisplayDevices", CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.StdCall)> _
    14. Public Shared Function EnumDisplayDevices(ByVal lpDevice As String, ByVal iDevNum As Integer, ByRef lpDisplayDevice As DISPLAY_DEVICE, ByVal dwFlags As UInteger) As Integer
    15. End Function
    16. <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)> _
    17. Public Structure DISPLAY_DEVICE
    18. <MarshalAs(UnmanagedType.U4)> _
    19. Public cb As Integer
    20. <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=32)> _
    21. Public DeviceName As String
    22. <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=128)> _
    23. Public DeviceString As String
    24. <MarshalAs(UnmanagedType.U4)> _
    25. Public StateFlags As DisplayDeviceStateFlags
    26. <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=128)> _
    27. Public DeviceID As String
    28. <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=128)> _
    29. Public DeviceKey As String
    30. End Structure
    31. <Flags()> _
    32. Enum DisplayDeviceStateFlags As Integer
    33. ''' <summary>The device is part of the desktop.</summary>
    34. AttachedToDesktop = &H1
    35. MultiDriver = &H2
    36. ''' <summary>The device is part of the desktop.</summary>
    37. PrimaryDevice = &H4
    38. ''' <summary>Represents a pseudo device used to mirror application drawing for remoting or other purposes.</summary>
    39. MirroringDriver = &H8
    40. ''' <summary>The device is VGA compatible.</summary>
    41. VGACompatible = &H10
    42. ''' <summary>The device is removable; it cannot be the primary display.</summary>
    43. Removable = &H20
    44. ''' <summary>The device has more display modes than its output devices support.</summary>
    45. ModesPruned = &H8000000
    46. Remote = &H4000000
    47. Disconnect = &H2000000
    48. End Enum
    49. Private hdc As IntPtr
    50. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    51. DisplayCross("DISPLAY")
    52. DisplayCross("\\.\DISPLAY2")
    53. End Sub
    54. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    55. Dim i, numberOfInterfaces As Integer
    56. Dim dispDev1 As New DISPLAY_DEVICE
    57. dispDev1.cb = Marshal.SizeOf(dispDev1)
    58. 'First we have to enumerate the adapters.
    59. i = 0
    60. While (EnumDisplayDevices(vbNullString, i, dispDev1, &H0) <> 0)
    61. i += 1
    62. End While
    63. numberOfInterfaces = i
    64. 'Once we know how many adapters there are, we'll loop and retrieve some data
    65. For i = 0 To numberOfInterfaces - 1
    66. EnumDisplayDevices(vbNullString, i, dispDev1, &H0)
    67. TextBox1.AppendText("-=Adapter=-" & vbCrLf)
    68. TextBox1.AppendText("deviceName:" & dispDev1.DeviceName & vbCrLf)
    69. TextBox1.AppendText("deviceString:" & dispDev1.DeviceString & vbCrLf)
    70. TextBox1.AppendText("deviceFlags:" & dispDev1.StateFlags & vbCrLf)
    71. TextBox1.AppendText("-=Monitor=-" & vbCrLf)
    72. EnumDisplayDevices(dispDev1.DeviceName, 0, dispDev1, &H1)
    73. TextBox1.AppendText("deviceName:" & dispDev1.DeviceName & vbCrLf)
    74. TextBox1.AppendText("deviceString:" & dispDev1.DeviceString & vbCrLf)
    75. TextBox1.AppendText("deviceFlags:" & dispDev1.StateFlags & vbCrLf)
    76. TextBox1.AppendText("--" & vbCrLf & vbCrLf)
    77. Next
    78. End Sub
    79. Private Sub DisplayCross(deviceVame As String)
    80. hdc = CreateDC(deviceVame, Nothing, Nothing, IntPtr.Zero)
    81. Dim RedPen As New Pen(Color.Red, 50)
    82. Dim GreenPen As New Pen(Color.GreenYellow, 50)
    83. Dim waW = Screen.PrimaryScreen.WorkingArea.Width
    84. Dim waH = Screen.PrimaryScreen.WorkingArea.Height
    85. Using g = Graphics.FromHdc(hdc) ' .FromHwnd(IntPtr.Zero)
    86. g.DrawLine(RedPen, 10, 10, waW - 10, waH - 10)
    87. g.DrawLine(GreenPen, waW - 10, 10, 10, waH - 10)
    88. g.DrawString(deviceVame, New Font("Comic Sans Ms", 70), New SolidBrush(Color.DarkBlue), 300, 300)
    89. End Using
    90. ReleaseDC(hdc, IntPtr.Zero)
    91. End Sub
    92. End Class

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Mit EnumDisplayDevices() kannst Du Dir die Namen der Devices auslesen. Dazu brauchst Du noch die Struktur DISPLAY_DEVICE und das Enumber DisplayDeviceStateFlags.


    Eddy schrieb:

    Mit EnumDeviceDisplay kann man sich sparen, haette nur dazu gedient an den Devicenamen zu kommen, daran kommen wir aber auch ueber die Screen-Klasse.
    And i think to myself... what a wonderfuL World!
    @Eddy Jou, ist mir durch die Lappen gegangen. ;)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hey @Eddy,
    mit dem einblenden habe ich das immer so gehandhabt:
    Load

    VB.NET-Quellcode

    1. Me.Opacity = 0.05
    2. Do Until Opacity = 1
    3. Me.Opacity += 0.01
    4. System.Threading.Thread.Sleep(10)
    5. Loop

    FormClosing

    VB.NET-Quellcode

    1. Do Until Opacity = 0.01
    2. Me.Opacity -= 0.01
    3. System.Threading.Thread.Sleep(10)
    4. Loop


    @RodFromGermany @Eddy
    Es muss an etwas anderem liegen (aber danke für das ausführliche Beispiel, Rod- da bekommt man ja wirklich alles aufgelistet ^^). Ich erhalte immer noch keine Zeichnung auf dem angeschlossenen Monitor (als Primärmonitor hinterlegt)- warum auch immer. Ich werde das mal auf einer anderen Umgebung testen müssen. Daran, dass VGA analog ist, kann es nicht hängen, oder? Wäre ja etwas 'blöd', wenn Windows sich darauf beziehen würde. Allerdings würde es vielleicht auch wider rum erklären, warum es bei mir nicht klappt.
    Na ja, ich habe zumindest hier noch einen DisplayPort Anschluss, neben dem VGA. Heute Abend werde ich mal schauen, was geschieht, wenn der Laptop über DP angeschlossen ist!
    Option Strict On!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Drahuverar“ ()

    Drahuverar schrieb:

    VB.NET-Quellcode

    1. Do Until Opacity = 1
    Das kann vor die Hose gehen, da da niemals genau 1 rauskommt.
    Machst Du

    VB.NET-Quellcode

    1. Do While Opacity <= 1
    2. ' bzw.
    3. Do While Opacity >= 0.01
    oder Du machst gleich eine For-Schleife.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Okay, danke für den Hinweis, @RodFromGermany

    Leider habe ich immer noch das Problem, dass die Anzeige auf dem Primärmonitor nicht gelingt. Immerhin geht es mit .FromHwnd.
    Ich werde das bei Gelegenheit nochmal genauer unter die Lupe nehmen, wobei ich schon so ziemlich alles getestet habe.. ~.~
    Option Strict On!
    Hey, hier mal ein Auszug:
    Spoiler anzeigen
    ​-=Adapter=-
    deviceName:\\.\DISPLAY1
    deviceString:NVIDIA Quadro K2100M
    deviceFlags:1
    -=Monitor=-
    deviceName:\\.\DISPLAY1\Monitor0
    deviceString:PnP-Monitor (Standard)
    deviceFlags:3
    --

    -=Adapter=-
    deviceName:\\.\DISPLAY2
    deviceString:NVIDIA Quadro K2100M
    deviceFlags:5
    -=Monitor=-
    deviceName:\\.\DISPLAY2\Monitor0
    deviceString:PnP-Monitor (Standard)
    deviceFlags:3
    --

    -=Adapter=-
    deviceName:\\.\DISPLAY3
    deviceString:NVIDIA Quadro K2100M
    deviceFlags:0
    -=Monitor=-
    deviceName:
    deviceString:
    deviceFlags:0
    --

    -=Adapter=-
    deviceName:\\.\DISPLAY4
    deviceString:NVIDIA Quadro K2100M
    deviceFlags:0
    -=Monitor=-
    deviceName:
    deviceString:
    deviceFlags:0
    --

    -=Adapter=-
    deviceName:\\.\DISPLAYV1
    deviceString:RDPDD Chained DD
    deviceFlags:2097160
    -=Monitor=-
    deviceName:
    deviceString:
    deviceFlags:0
    --

    -=Adapter=-
    deviceName:\\.\DISPLAYV2
    deviceString:RDP Encoder Mirror Driver
    deviceFlags:2097160
    -=Monitor=-
    deviceName:
    deviceString:
    deviceFlags:0
    --

    -=Adapter=-
    deviceName:\\.\DISPLAYV3
    deviceString:RDP Reflector Display Driver
    deviceFlags:2097160
    -=Monitor=-
    deviceName:
    deviceString:
    deviceFlags:0
    --


    ​\\.\DISPLAY1 und ​\\.\DISPLAY2 sollten dann ja die beiden Monitore sein.
    Option Strict On!
    (Auch wenn es "etwas" spät kommt:

    Bluespide schrieb:

    Graphics.FromHwnd(IntPtr.Zero)
    Bringt dir immer nur den Primären Desktiop

    Menno...hab gehofft, ich könnte mit der Klasse Screen aus System.Windows.Controls punkten. Leider hat die Klasse keinen Verweis aus dem Handle (IntPtr), welcher dem Screen zugrundliegt. Dafür aber den Namen (wie @Drahuverar gesagt hat): \\.\DISPLAY1 und \\.\DISPLAY2.

    VB.NET-Quellcode

    1. Dim screenList = Screen.AllScreens.Select(Function(x) x.ToString()).ToList()
    2. Debug.WriteLine(String.Join(Environment.NewLine, screenList))

    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    @Radinator
    Jou, dachte anfangs auch, dass hat man sicher "schnell gemacht" ^^

    @RodFromGermany, @Eddy
    Also es liegt definitiv an dem VGA-Anschluss. Über Displayport funktioniert es. Auch auf anderen Geräten mit Displayport funktionierte es auf Anhieb.
    Ich teste da mal noch heute Abend, wenn ich dazu komme, etwas. Dann melde ich mich wieder zu dem Thema.
    Option Strict On!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Drahuverar“ ()