Resolution, Position und Frequenz aus Fenster und Vollbild Modus aus Prozesse lesen.

  • VB.NET

Es gibt 66 Antworten in diesem Thema. Der letzte Beitrag () ist von Xiantrius.

    Ich muss gestehen ich habe zu wenig Ahnung wie man mit Directx und GDI Programmierung umgeht, sonst hätte ich schon ein Ansatz gepostet...
    Vielleicht kann das jemand ein wenig zb. mal zeigen wie man ein Fullscreen Prozess ausliest das mit Opengl, GDI, oder Directx usw... arbeitet?
    Geht es denn nicht bei Spielen und FullScreen Exclusive? Für FullScreen könnte man auch versuchen mit GetWindowRect ein RECT zu hohlen und das mit den Monitor(en)-Bounds vergleichen. Aber zum einstellen sehe ich keine Mögklichkeit wenn das mit SetWindowPos nicht geht. Da müsste man an die SwapChain kommen, bei Directx11 vllt. leichter machar als bei DirectX12, denn da musst man alles um die Swapchain freigeben und neu laden, beim switch zwischen Fullscreen exclusive and anderen. Möglicherweise hat das schon jemand erlebt, das beim wechseln des Modus mit ALT+Enter ein DX12 spiel gecrasht ist.

    Aber ich denke das einstellen bei DirectX Programmen wirste nicht umsetzen können, ich wüsste nur mit DLL Injection was, aber das gehört nicht in dieses Forum, zudem bräuchtest du kenntnisse für C++, DX 9, 11 und 12 um das hinbekommen zu können.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Takafusa“ ()

    Darum mach ich das ja ungern. Ich weis das über solche Themen hier nicht so gerne gesprochen wird.
    Aber ich sage dir, ich kenne jemand der das auf VB sogar macht und sich mit Assembly auskennt und injectet. Finde ich aber total kompliziert.
    Wie du schon sagtest das Thema gehört nicht hierher daher vertiefe ich das nicht weiter.

    GetWindowRect wäre meine einzige Hoffnung, wenn das da nicht funktioniert.... müsste mich da noch näher einarbeiten.
    Aber heute nicht mehr, eventuel in laufe der Woche, oder Samstag. Muss ab morgen wieder arbeiten, sorry.

    Xiantrius schrieb:

    Aber ich sage dir, ich kenne jemand der das auf VB sogar macht und sich mit Assembly auskennt und injectet. Finde ich aber total kompliziert.


    Klar kannste auch mit VB eine DLL injecten, das ist kein Problem, geht auch mit java, Python etc...., aber eine .NET DLL wird nicht so einfach(wenn überhaupt) funktionieren. Diese müsstest du dann in C, C++, ASM oder sonstwas machen, wobei sich C++ super anbietet, da auch die Beispiele im SDK alle in C++ sind, wie auch die Doku.

    Aber eigenlich ist es besser das nicht zu tun, was wenn ein Spieler gebannt wird, weil ein Spiel die Injektion bemerkt? Mann kann ja schauen welche Module geladen sind. Und das nur wegen eines Tools zum umstellen vom WindowState.

    Ausserdem, die meisten Spiele haben bereits intern eine Einstellung für die Auflösung, oft auch für FS/Windowed, daher sehe ich eigendlich auch keinen Grund das extern zu managen.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Takafusa“ ()

    Guten morgen,
    Mein Plan war nicht von Spiel die Auflösung zu ändern, sondern solange das Spiel in Vollbildmodus ist den Desktop die selbe Auflösung und Frequenz zu verpassen.
    Der Grund ist das die umschaltzeit kürzer ist wenn man mal ALT+TAB drückt um in Desktop zu switchen und wieder zurück ins Spiel.
    Da ich auch alte Spiele habe wo das anders ist und die Auflösung sogar überhaupt nicht geändert werden kann. Ich nenne jetzt mal 2 Spiel wo ich es ganz sicher weiß. Sie heißen Pax Imperia, Master Of Orion 2 usw...
    Mein Ziel ist es das mein Tool Automatisch erkennt das dieses Spiel in Vollbild ist und den Desktop ebenfalls umschaltet in die selbe Auflösung mit Frequenz und beim verlassen des Spiels wieder die Ursprüngliche Auflösung zurück stellt bevor ich das Spiel gestartet habe.

    mfg.
    Xiantrius
    Jetzt gerade fällt mir noch was ein, ich hatte damals ein Tool verwendet um einen Prozess einfacher debuggen zu können, damit kann man auch Fenstereigenschaften setzen, weiss jetzt nicht ob das nur bei starten ging, oder auch während der Prozess lief, aber ein Blick ins Projekt könnte dir weitere Hinweise geben. Damit hatte ich es erreicht, das ein FS-Exklusive Fenster, das sich intern nicht auf Windowed umstellen lies, windowed lief. Unterstützt glaub ich bis DX11.
    github.com/DxWnd
    DxWnd kenne ich. Beim starten eines Spiels wurde es ausgeführt.
    Mir geht es nur darum das aus zu lesen. Will da dran nichts verändern.

    Erfolg mit hilfe des Sources:
    Jetzt funktioniert auch bei Fullscreen und bin froh das du mir ein Tip gegeben hast @Takafusa wegen GetWindowRect.

    Das war wirklich der Schlüssel. Habe auch das Thread gefunden mit den Source Code.
    Window Manager (open source)

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Declare Function GetAsyncKeyState Lib "user32.dll" (ByVal vKey As Keys) As Short
    3. Private Function DoesProcessExists(ByVal PName As String) As Boolean
    4. Return System.Diagnostics.Process.GetProcessesByName(PName).Length >= 1
    5. End Function
    6. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    7. Prozessliste()
    8. End Sub
    9. Private Sub AutoSizeListViewColumns(oListView As ListView)
    10. SuspendLayout()
    11. For nCol = 0 To oListView.Columns.Count - 1
    12. oListView.Columns(nCol).Width = -1 'forces autosizing on column
    13. If oListView.Columns(nCol).Width < 100 Then
    14. oListView.Columns(nCol).Width = 100
    15. End If
    16. Next
    17. oListView.Refresh()
    18. ResumeLayout()
    19. End Sub
    20. Dim CheckList As Boolean
    21. Dim CheckColumn As Boolean
    22. Dim Alle_Prozesse As Process
    23. Private Sub Prozessliste()
    24. If CheckColumn = False Then
    25. CheckColumn = True
    26. ListView1.FullRowSelect = True
    27. ListView1.Columns.Add("FensterHandle")
    28. ListView1.Columns.Add("Fensternamen")
    29. ListView1.Columns.Add("Prozesse")
    30. ListView1.Columns.Add("Prozess-ID")
    31. ListView1.Columns.Add("RAM")
    32. ElseIf CheckColumn = True Then
    33. End If
    34. If CheckList = False Then
    35. 'CheckList = True
    36. ListView1.Items.Clear()
    37. For Each Alle_Prozesse In Process.GetProcesses()
    38. If Alle_Prozesse.MainWindowHandle.ToInt32 > 0 Then
    39. With ListView1.Items.Add(Hex(Alle_Prozesse.MainWindowHandle.ToString))
    40. .SubItems.Add(Alle_Prozesse.MainWindowTitle)
    41. .SubItems.Add(Alle_Prozesse.ProcessName)
    42. .SubItems.Add(Hex(Alle_Prozesse.Id.ToString))
    43. End With
    44. End If
    45. Next
    46. If ListView1.Items.Count > 0 Then
    47. AutoSizeListViewColumns(ListView1)
    48. End If
    49. End If
    50. End Sub
    51. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    52. Prozessliste()
    53. End Sub
    54. <Runtime.InteropServices.DllImport("user32.dll")>
    55. Private Shared Function GetWindowPlacement(ByVal hWnd As IntPtr, ByRef lpwndpl As WINDOWPLACEMENT) As Int32
    56. End Function
    57. <Runtime.InteropServices.DllImport("user32.dll")>
    58. Private Shared Function GetWindowRect(ByVal hWnd As IntPtr, ByRef lpRect As RECT) As Boolean
    59. End Function
    60. <Runtime.InteropServices.StructLayout(Runtime.InteropServices.LayoutKind.Sequential)>
    61. Public Structure RECT
    62. Public Left As Int32
    63. Public Top As Int32
    64. Public Right As Int32
    65. Public Bottom As Int32
    66. End Structure
    67. Dim XYRect As RECT
    68. Public Structure POINTAPI
    69. Public X As Int32
    70. Public Y As Int32
    71. End Structure
    72. Public Structure WINDOWPLACEMENT
    73. Public Length As Int32
    74. Public flags As Int32
    75. Public showCmd As Int32
    76. Public ptMinPosition As POINTAPI
    77. Public ptMaxPosition As POINTAPI
    78. Public rcNormalPosition As RECT
    79. Public rcDevice As RECT
    80. End Structure
    81. Dim intRet As Integer
    82. Dim wpTemp As WINDOWPLACEMENT
    83. Dim HWND As IntPtr
    84. Dim WindowMode_Information(1) As String
    85. Public Function GetWindowRectangle(ByVal hwnd As IntPtr) As Rectangle
    86. Dim XYRect As RECT
    87. GetWindowRect(hwnd, XYRect)
    88. Dim rr As New Rectangle(XYRect.Left, XYRect.Top, XYRect.Right - XYRect.Left, XYRect.Bottom - XYRect.Top)
    89. WindowMode_Information(0) = GetWindowRect(hwnd, XYRect) & vbNewLine & rr.ToString
    90. Return rr
    91. End Function
    92. Public Function IsFullscreen(ByVal hwnd As IntPtr) As String
    93. Dim R As Rectangle = GetWindowRectangle(hwnd)
    94. If R.Width >= My.Computer.Screen.Bounds.Width AndAlso R.Height >= My.Computer.Screen.Bounds.Height Then
    95. Return "Fullscreen"
    96. End If
    97. WindowMode_Information(1) = "Von Prozess Breite: " & R.Width & vbNewLine &
    98. "Von Prozess Höhe: " & R.Height & vbNewLine & vbNewLine &
    99. "Von Bildschirm Breite: " & My.Computer.Screen.Bounds.Width & vbNewLine &
    100. "Von Bildschirm Höhe: " & My.Computer.Screen.Bounds.Height
    101. Dim intRet As Integer
    102. Dim wpTemp As WINDOWPLACEMENT
    103. wpTemp.Length = System.Runtime.InteropServices.Marshal.SizeOf(wpTemp)
    104. intRet = GetWindowPlacement(hwnd, wpTemp)
    105. If wpTemp.showCmd = 1 Then
    106. Return "Normal"
    107. ElseIf wpTemp.showCmd = 2 Then
    108. Return "Minimized"
    109. ElseIf wpTemp.showCmd = 3 Then
    110. Return "Maximized"
    111. End If
    112. Return "Error"
    113. End Function
    114. Private Sub CheckWindowMode()
    115. TextBox3.Text = IsFullscreen(HWND)
    116. TextBox4.Text = IsFullscreen(HWND) & vbNewLine & WindowMode_Information(0) & vbNewLine & vbNewLine & WindowMode_Information(1)
    117. End Sub
    118. Dim Prozess() As Process
    119. Private Sub PrüfeWindowedModus()
    120. 'With ListView1.Items.Add(Hex(Alle_Prozesse.MainWindowHandle.ToString))
    121. If ListView1.SelectedItems.Count > 0 Then
    122. For Each Prozess As Process In Process.GetProcessesByName(ListView1.SelectedItems.Item(0).SubItems(2).Text)
    123. TextBox1.Text = Prozess.ProcessName
    124. wpTemp.Length = System.Runtime.InteropServices.Marshal.SizeOf(wpTemp)
    125. intRet = GetWindowPlacement(Prozess.MainWindowHandle, wpTemp)
    126. HWND = Prozess.MainWindowHandle
    127. If Not Prozess.MainWindowHandle = IntPtr.Zero Then
    128. TextBox2.Text = Hex(Prozess.MainWindowHandle.ToString)
    129. CheckWindowMode()
    130. End If
    131. Next
    132. End If
    133. End Class


    Mfg.
    Xiantrius

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Xiantrius“ ()

    Achso, du willst nur auslesen, dachte auch einstellen. Aber schön das du dein Ziel ereicht hast, wobei ich gerade noch was zum verbessern sehe.
    Das hier:

    VB.NET-Quellcode

    1. Dim R As Rectangle = GetWindowRectangle(hwnd)
    2. If R.Width >= My.Computer.Screen.Bounds.Width AndAlso R.Height >= My.Computer.Screen.Bounds.Height Then
    3. Return "Fullscreen"
    4. End If


    könnte in die Hose gehen, ich weiss nicht welchen Screen dir My.Computer gibt, was wenn mehrere monitor da sind? Ich denke du wirst den Hauptbildschirm bekommen, bei mir im Garten z.b. ist der Hauptmonitor FHD, der 2. Screen(Beamer) UHD, wäre dan nun ein ein Fenster >= FHD drauf, würdest du Fullscreen bekommen, obwohl es nicht so ist. Um das auszumerzen, kannste schauen, ob die X/Y Koordinaten in den Screen.Bounds sind. Hatte die Screen Klasse ganz vergessen, wollte dir schon GetMonitorFromPoint empfehlen, täte auch gehen, aber umständlicher.

    VB.NET-Quellcode

    1. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    2. Dim screens() As Screen = Screen.AllScreens
    3. For i As Integer = 0 To screens.Length - 1
    4. If screens(i).Bounds.Contains(Cursor.Position) Then
    5. Debug.WriteLine("Cursor auf Bildschrim " & i)
    6. End If
    7. Next
    8. End Sub


    So kannst du ermitteln auf welchen Screen das Fenster ist und hast dann die richtigen Werte. Um noch detailiertere Infos zu bekommen, kannst du auch, GetClientRect nutzen, wenn dieses Rect den Screenbounds entspricht ist das Fenster FullScreen Borderless, stimmt GetWindowRect mit den Bounds überein, ist es Fullscreen mit Border.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Takafusa“ ()

    Hab mal das Thema angepasst, weil das was ich vor hatte nicht unbedingt wichtig ist.
    Vorweg gesagt gebe ich dir recht mit My.Computer funktioniert es zwar, aber ab den 2 Monitor wäre es tatsächlich ein problem.
    @Takafusa
    @-Franky-
    oder jemand anders der das probieren will.
    Hat jemand zufällig 2 Monitore und würde den modifizierten Code testen?
    Der Wert 0 sollte für den 1 Monitor stehen wenn der Cursor dort angezeigt wird.
    Der Wert 1 sollte für den 2 Monitor stehen wenn der Cursor dort angezeigt wird.
    Der Wert 2 sollte für den 3 Monitor stehen wenn der Cursor dort angezeigt wird usw....
    Leider kann ich das nicht für den 2 Monitor testen ob der Code auch wirklich greift sollte der Cursor auf den 2 Bildschirm übergehen, da ich kein 2 Monitor habe.

    VB.NET-Quellcode

    1. Private Sub Auslesen
    2. TextBox1.Text = IsFullscreen(HWND)
    3. End Sub
    4. Public Function IsFullscreen(ByVal hwnd As IntPtr) As String
    5. Dim R As Rectangle = GetWindowRectangle(hwnd)
    6. Dim screens() As Screen = Screen.AllScreens
    7. For i As Integer = 0 To screens.Length - 1
    8. If screens(i).Bounds.Contains(Cursor.Position) AndAlso screens(i).Bounds.Contains(Cursor.Position) Then
    9. If R.Width >= screens(i).Bounds.Width AndAlso R.Height >= screens(i).Bounds.Height Then
    10. Return "Monitor=" & i & ", FensterMode=Fullscreen"
    11. End If
    12. End If
    13. 'If R.Width >= My.Computer.Screen.Bounds.Width AndAlso R.Height >= My.Computer.Screen.Bounds.Height Then
    14. ' Return "Fullscreen"
    15. 'End If
    16. WindowMode_Information(1) = "Von Prozess Breite: " & R.Width & vbNewLine &
    17. "Von Prozess Höhe: " & R.Height & vbNewLine & vbNewLine &
    18. "Von Bildschirm Breite: " & My.Computer.Screen.Bounds.Width & vbNewLine &
    19. "Von Bildschirm Höhe: " & My.Computer.Screen.Bounds.Height
    20. Dim intRet As Integer
    21. Dim wpTemp As WINDOWPLACEMENT
    22. wpTemp.Length = System.Runtime.InteropServices.Marshal.SizeOf(wpTemp)
    23. intRet = GetWindowPlacement(hwnd, wpTemp)
    24. If wpTemp.showCmd = 1 Then
    25. Return "Monitor: " & i & ", FensterMode=Normal"
    26. ElseIf wpTemp.showCmd = 2 Then
    27. Return "Monitor: " & i & ", FensterMode=Minimized"
    28. ElseIf wpTemp.showCmd = 3 Then
    29. Return "Monitor: " & i & ", FensterMode=Maximized"
    30. End If
    31. Next
    32. Return "Error"
    33. End Function


    Als nextes wäre noch eine wichtige sache die fehlt, kann man irgendwie die aktuelle Monitor Frequenz so wie beim Desktop von einer Form die in Vollbild ist auslesen?

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Xiantrius“ ()

    Xiantrius schrieb:

    For i As Integer = 0 To screens.Length - 1
    If screens(i).Bounds.Contains(Cursor.Position) AndAlso screens(i).Bounds.Contains(Cursor.Position) Then
    If R.Width >= screens(i).Bounds.Width AndAlso R.Height >= screens(i).Bounds.Height Then
    Return "Monitor=" & i & ", FensterMode=Fullscreen"
    End If
    End If


    Da hat sich ein Copy&Paste Fehler eingeschlichen :D
    Die CursorPosition hab ich nur genommen um zu verdeutlichen wie du einfach testen kannst ob ein Point(System.Drawing.Point, nicht der, den du von der WinAPI kennst) in einem Rectangle ist. Anstatt Cursor.Position, nimmste die Fensterkoordinaten new Point(fenster.location.x, fenster.location.y) Ich dachte das ist offensichtlich, beim nächsten mal erwähne ich das besser.

    Warum testest du hier doppelt?
    Kurze erklärung, Bounds ist ein Rectangle, das bietet die Funktion Contains um zu schauen, ob sich ein Punkt innerhalb dieses Rectangle befindet. Cursor.Position ist ein Point.

    VB.NET-Quellcode

    1. If screens(i).Bounds.Contains(Cursor.Position) AndAlso screens(i).Bounds.Contains(Cursor.Position) Then

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Takafusa“ ()

    haste den code getestet? was kommt den raus?

    schau hier
    hab My.Computer raus genommen und mit screens ersetzt. Ich dachte deine abfrage muss mit rein damit er auf den anderen Display den Cursor erkennt und drauf reagiert. War wohl ein denkfehler? Kann es halt nicht testen da ich nur 1 Monitor habe.

    VB.NET-Quellcode

    1. If R.Width >= screens(i).Bounds.Width AndAlso R.Height >= screens(i).Bounds.Height Then

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

    Diese Zeile versaut es dir u.U. hin und wieder:

    VB.NET-Quellcode

    1. If screens(i).Bounds.Contains(Cursor.Position) AndAlso screens(i).Bounds.Contains(Cursor.Position) Then


    Da du nur 1 Screen hast, konnte es dir beim normalen Programmablauf nicht auffallen, was wenn der Cursor auf Monitor 0 ist, aber das Fenster auf 1 oder 2? Siehe oben was ich sagte mit den Fensterkoordinaten anstatt Cursor.Position.

    Das ist auch weniger Optimal

    VB.NET-Quellcode

    1. If R.Width >= screens(i).Bounds.Width AndAlso R.Height >= screens(i).Bounds.Height Then


    Du solltest schon testen ob die Werte gleich sind, nicht grösser gleich. Stell dir vor FensterX ist auf screen 1 mit FHD Auflösng, fenster position x=900, y=900, width = 1920, height = 1080
    Ist definitiv kein FullScreen, nur ein verschobenes Fenster, würde dir aber fullscreen ausgeben.


    Edit @Xiantrius
    Ich habe mal eben selbst was probiert, dabei habe ich festgestellt, das GetWindowRect nicht 100% korrekte daten liefert, zumindest nicht korrekt in dem Sinne wie wir es gedacht haben. Habe ich ein Fenster Maximiert, bekomme ich diese rect raus, Left: -8, Top: -8, Right: 3848, Bottom: 2128, habe auch schon recherchiert, swcheint sich entweder um eine DPI Sache zu handeln, auch was von transparenten bereich der Border hab ich was gelesen, ich schau mal ob sich was machen lässt.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Takafusa“ ()

    Das ist aber fast das gleiche wie das. Nur das es nur für 1 Monitor ist.

    VB.NET-Quellcode

    1. If R.Width >= My.Computer.Screen.Bounds.Width AndAlso R.Height >= My.Computer.Screen.Bounds.Height Then
    2. Return "Fullscreen"
    3. End If


    Was schlägst du also vor? hab gerade echt keine idee wie es anders gehen soll...
    Komisch hat aber immer funktioniert wenn ich ein Spiel in Vollbild hatte.

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

    Takafusa schrieb:

    Edit @Xiantrius
    Ich habe mal eben selbst was probiert, dabei habe ich festgestellt, das GetWindowRect nicht 100% korrekte daten liefert, zumindest nicht korrekt in dem Sinne wie wir es gedacht haben. Habe ich ein Fenster Maximiert, bekomme ich diese rect raus, Left: -8, Top: -8, Right: 3848, Bottom: 2128, habe auch schon recherchiert, swcheint sich entweder um eine DPI Sache zu handeln, auch was von transparenten bereich der Border hab ich was gelesen, ich schau mal ob sich was machen lässt.


    Ich hatte da was festgestellt, bin auf spurensuche.
    @Takafusa

    Ich muss dir mitteilen bei Spy++ ist der wert genauso zb.: bei Notepad++
    Wenn ich es maximiere bei Notepad++
    (-8, -8)-(1928, 1048), 1936x1056 (Maximiert)

    Ok hier ist eine kleine abweichung mit der X Wert der ist 0
    Bei Firefox wenn es maximiert ist.
    (0, -8)-(1920, 1040), 1920x1048

    Vielleicht ist im code irgendwo ein fehler drin, wenn die Anzeige noch nicht ganz stimmt.

    mein tool macht X und Y auf -8 bei Firefox.

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

    Ich hab jetzt auch mal geschaut, was mir GetClirntRect ausgibt, da stimmt die Breite, aber in der Höhe habe ich eine differenz zur Screen.WorkingArea, hat sicher mit der Taskbar zu tun. Langsam krieg ich zu viel mit Windows, sollte ich verbannen und nur noch Linux nutzen. :S

    Ich werde morgen noch mal weiter schauen ob man da nicht was brauchbares hinbekommt. Ich mach jetzt erstmal mit meinem ESP32 Fahrradtacho weiter(überträgt daten via BlueTooth zum Handy am lenker) , muss sowas wie ein Ringbuffer einbauen, damit der nicht mehr so rumspringt bei niedrigen Geschindigkeiten.

    @-Franky- die Idee sollte funktionieren, ich probier das doch eben noch.

    Edit @Xiantrius (code noch mal geändert)
    So, das sollte gehen. Finde ich zwar nicht so schön, mit dem herumrechnen, aber eine lösung ist besser als keine. Funktioniert zumindest ohne diese >= Geschichte. So nun zum Tacho.

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.Runtime.InteropServices
    3. Public Class Form1
    4. <DllImport("user32.dll")>
    5. Private Shared Function GetWindowRect(ByVal hWnd As IntPtr, ByRef lpRect As RECT) As Boolean
    6. End Function
    7. Public Structure RECT
    8. Public Left As Integer
    9. Public Top As Integer
    10. Public Right As Integer
    11. Public Bottom As Integer
    12. Public Overrides Function ToString() As String
    13. Return String.Format("Left: {0}, Top: {1}, Right: {2}, Bottom: {3}", Left, Top, Right, Bottom)
    14. End Function
    15. End Structure
    16. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    17. Dim p() As Process = Process.GetProcessesByName("notepad++")
    18. Dim rect As New RECT
    19. If GetWindowRect(p(0).MainWindowHandle, rect) Then
    20. If rect.Left < 0 Then
    21. rect.Right += rect.Left
    22. rect.Left = 0
    23. End If
    24. If rect.Top < 0 Then
    25. rect.Bottom += rect.Top
    26. rect.Top = 0
    27. End If
    28. Dim screens() As Screen = Screen.AllScreens
    29. For i As Integer = 0 To screens.Length - 1
    30. If screens(i).WorkingArea.Contains(New Point(rect.Left, rect.Top)) Then
    31. Dim r As Rectangle = screens(i).WorkingArea
    32. If r.X = rect.Left AndAlso r.Y = rect.Top AndAlso r.Width = rect.Right AndAlso r.Height = rect.Bottom Then
    33. Debug.WriteLine("FullScreen")
    34. End If
    35. End If
    36. Next
    37. End If
    38. End Sub
    39. End Class

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Takafusa“ ()

    hmm jetzt macht aus Maximized ein Fullscreen was aber nicht stimmt.
    Nehme ich den anderen Code wieder wird das mit den Fullscreen nicht bei Maximized dargestellt.
    Zwar zeigt er an X -8 Y -8 aber er liest wenigstens das richtig aus das er genau das anzeigt wie ich die es Ausführe.

    Lese ich ein echten Fullscreen aus dann zeigt er vollbild an.
    bei maximiert, Normal und minimiert funktioniert das ebenfalls mit der anzeige korrekt zumindest bei einen Monitor, bis auf X, Y, Width und Height werden etwas anders angezeigt.

    Das mit den berechnen ist wohl nicht ganz die richtige methode, aber naja du sagtest ja bereits der code ist nicht schön...

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Xiantrius“ ()

    Du liest ja den WindowState bereits aus, wenn dieser Maximized ist, brauchste ja nicht mehr auf FullScreen prüfen, als testen ob Maximized, wenn nicht kannste auf Fullsreen testen. Zumindest sollte es bei Fenstern die nicht Maximized sind, aber Fullscreen windowed(ohne border) sind nun auch klappen. Möglicherweise auch bei spielen die Fullscreenexclusive sind.(mit spielen hatte ich nicht getestet)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Takafusa“ ()

    Hab dein Code getestet er zeigt bei Fullscreen Spiele
    Normal an.

    Bei mein überarbeiteten Code zeigt er Fullscreen, wo dir nicht so ganz gefallen hat.

    Vielleicht ist das bei der API normal das die Werte so angezeigt werden, ohne selbst dran rum zu rechnen und darum wird das korrekt dargestellt...
    Wenn ich nur wüsste wo amsonsten das problem liegen könnte...

    Weil ich nur 1 Monitor habe mache ich folgendes:
    Ich mach da ein trick um den Fullscreen sehen zu können und zwar lasse ich die sub über ein timer laufen wo er ausliest und mach eine keys abfrage und wenn das spiel in vollbild ist dann drücke ich die tasten. dann zeigt er es wenn ich das spiel wieder minimiere das es in vollbild war.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Xiantrius“ ()