Wie funktionieren bestimmte API's richtig?

  • VB.NET

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

    Den Vorgänger Code hab ich auch mal gepostet in Post 39 .

    Da siehst du was ich eigentlich für ein Ziel habe.
    Es wird ja gesagt mit Enumchild könnte es funktionieren das man das noch besser hinbekommt.

    Die nexte aufgabe würde dann sein herauszufinden wie man das noch besser mit den Fullscreen auslesen hinbekommt, so das jedes Spiel erfolgreich ausgelesen werden kann ob es in Vollbild ist, oder nicht.

    Muss auch gestehen mit Datagridview hab ich sehr wenig gearbeitet da hab ich nur 1 Projekt amsonsten nie.

    Ok hab es verbessert.
    Was ist der unterschied zwischen ....

    VB.NET-Quellcode

    1. 'DataTable
    2. dt.clear
    3. 'und
    4. dt.Rows.Clear()
    5. '???


    Habe auch mit solchen variable noch nie gearbeitet
    wie DataTable und DataView.

    VB.NET-Quellcode

    1. Public dt As New DataTable
    2. Public dv As New DataView(dt)

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

    Guten morgen zusammen.
    Nicht zwangsläufig, man kann auch für API's, funktionen,subs usw... für ein beliebigen Modul/Class Name verwenden.
    Habe noch nie erlebt das es eine bestimmte Klasse gebraucht wird um die funktion zu gewährleisten.
    Wenn ich ehrlich sein soll mag ich Modul lieber als Class.
    Der Vorteil ist man muss sie nicht deklarieren und wird Automatisch erkannt.
    @Panter hat es anscheinend raus editiert, hab es aber gestern gelesen nur ein Beispiel. Er wunderte sich, dass die funktionen die zuvor bei der Forms Anwendung drin waren jetzt bei Modul drin sind und sogar funktionieren.
    Man kann auch alles bei Windows Forms direkt rein packen. Das beeinträchtigt die Funktion auf keiner weise.
    Ich wüsste jetzt keine Einzelfälle wo das anders ist.
    Bei den meisten API zb. sollte der Name zb. Sendmessage nicht geändert werden, weil die user32.dll das nicht unterstützt und rum meckert sobald die API dann mit veränderten namen zum einsatz kommen soll.
    Sollte es doch ein, oder mehrere fälle geben wo es genauso ist das man genau den festen Classname, oder Modulnamen brauch, um die funktion zu gewährleisten, dann hatte ich das bisher noch nicht erlebt.
    Was Microsoft meint ist denke ich ein vorgeschlagener Name.
    Könnte natürlich auch sein das bei C# und C++ verpflichtend ist bestimmte Namen zu nehmen, damit die Funktion gewährleistet bleibt.
    Habe selbst noch nie mit C# und C++ wirklich gearbeitet und kann es deshalb nicht sagen ob das tatsächlich so ist.

    mfg.
    Xiantrius

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

    Hallo zusammen

    Beim Datatable (ist zwar auch eine Referenz) sind die Daten gespeichert. Das Dataview greift auf das Datatable zurück und wird mit dem Datagrid gebunden. - man kann dort die Daten sortieren und filtern. Daher reicht es, wenn eben die Daten aus dem Datatable gelöscht werden. Das Datagrid und das Dataview haben dann automatisch keine Daten mehr. Ob du dt.Rows.Clear() oder dt.Clear() verwendest ist schnuppe, bitte einfach den Rest weglassen.

    Mein Ding sind halt Datenbanken, dort werden diese Typen verwendet.

    mfg
    Das hab ich nicht gewusst.
    Das heist um das jetzt mal umzudenken ist Datagridview1 zb. sowas wie eine Verknüpfung.
    Wird DataTable mit Datagridview verknüpft werden die Daten Sichtbar im Datagridview und deshalb heist es dann...

    VB.NET-Quellcode

    1. 'Heist dann DataSource ist fast so als wenn eine Verknüfung angelegt wird.
    2. Datagridview1.DataSource = Datatable
    3. 'Ach deshalb funktioniert
    4. Datagridview1.Rows.Clear
    5. 'nicht.
    6. 'Man muss dann entweder den Quelleninhalt löschen.
    7. Datatable.clear
    8. 'oder
    9. Datatable.Rows.clear
    10. ' Oder die Quellverbindung mit der Verknüpfung beenden in den man Datagridview1.
    11. 'problem ist die Daten bleiben in Datatable dann erhalten und würden den Eintrag verdoppeln um das zu vermeiden müsste man gleich die Quelle löschen.
    12. Datagridview1.DataSource = Nothing
    13. 'anwendet.


    Hab ich das so in etwa richtig verstanden?

    Xiantrius schrieb:

    Hab ich das so in etwa richtig verstanden?
    Du musst nicht das DataGridView bedienen, das machst Du doch über die DataTable, die an das DGV gebunden ist.
    Datagridview1.Rows.Clear() ist nicht erdforderlich.
    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!

    Xiantrius schrieb:

    Bei den meisten API zb. sollte der Name zb. Sendmessage nicht geändert werden, weil die user32.dll das nicht unterstützt und rum meckert sobald die API dann mit veränderten namen zum einsatz kommen soll.


    Wenn der Name sich nicht mit dem des Originalen deckt, teile den EntryPoint mit, dann kannst du jede API-Funktion nennen wie du Lust und Laune hast, auch SendMessage. Aber, sowas sollte man nicht tun, mit den richtigen oder nur leicht geänderten Namen, ist sofort zu sehen, welche Funktion es ist.

    VB.NET-Quellcode

    1. <DllImport("user32.dll", CharSet:=CharSet.Ansi, EntryPoint:="GetWindowTextA")>
    2. Public Shared Function HerMitDemTextVomFenster(hwnd As IntPtr, <MarshalAs(UnmanagedType.LPStr)> lpString As StringBuilder, nMaxCount As Integer) As Integer
    3. End Function
    Hallo zusammen

    Mein Freund Google meinte, dass Dir vielleicht ein weiteres API, das GetWindowPlacement Lib, was bringt..
    Betreffend dem Datatable: Du darst das gerne auch unbauen in eine Listbox, welche Du ja besser kennst.

    Sorry - ich habe erst jetzt gesehen, dass Du diese API ja schon benützt...

    VB.NET-Quellcode

    1. Imports System.Diagnostics
    2. Imports Microsoft.VisualBasic
    3. Public Class form2
    4. Dim dt As New DataTable
    5. Dim dv As New DataView(dt)
    6. Dim Parent_Handle As IntPtr
    7. Private Sub Aktives_Fenster_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    8. With dt.Columns
    9. .Add("Handle", Type.GetType("System.Int64"))
    10. .Add("Handle_child", Type.GetType("System.Int64"))
    11. .Add("ClassName", Type.GetType("System.String"))
    12. .Add("MainWindowTitle", Type.GetType("System.String"))
    13. .Add("FensterStatus", Type.GetType("System.String"))
    14. End With
    15. DataGridView1.DataSource = dv
    16. Call neu_einlesen()
    17. End Sub
    18. Public Sub neu_einlesen()
    19. dt.Clear()
    20. ' alle Prozesse durchlaufen
    21. For Each oProcess As Process In Process.GetProcesses
    22. If oProcess.MainWindowHandle <> IntPtr.Zero Then
    23. Dim windowHandle As IntPtr = oProcess.MainWindowHandle
    24. Dim row As DataRow = dt.NewRow()
    25. row!Handle = windowHandle.ToString
    26. row!MainWindowTitle = GetActiveWindowText(windowHandle) 'oProcess.MainWindowTitle.ToString
    27. row!ClassName = ClassName(windowHandle)
    28. row!FensterStatus = FensterStatus(windowHandle)
    29. dt.Rows.Add(row)
    30. Parent_Handle = windowHandle
    31. GetChild(windowHandle)
    32. End If
    33. Next
    34. dv.Sort = "Handle ASC"
    35. End Sub
    36. Public Function Enumerate(hWnd As IntPtr, lParam As IntPtr) As Boolean
    37. Dim row As DataRow = dt.NewRow()
    38. row!Handle = Parent_Handle.ToInt64
    39. row!Handle_child = CInt(hWnd.ToString)
    40. row!Classname = ClassName(hWnd)
    41. row!MainWindowTitle = GetActiveWindowText(hWnd)
    42. row!FensterStatus = FensterStatus(hWnd)
    43. dt.Rows.Add(row)
    44. Return True
    45. End Function
    46. Public Function GetChild(hwnd As IntPtr) As Boolean
    47. Dim x As Boolean
    48. x = EnumChildWindows(hwnd, AddressOf Enumerate, CType(0, IntPtr))
    49. Return True
    50. End Function
    51. Private Sub bt_neu_einlesen_Click(sender As Object, e As EventArgs) Handles bt_neu_einlesen.Click
    52. Call neu_einlesen()
    53. End Sub
    54. End Class




    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Imports System.Text
    3. Module Module1
    4. <DllImport("user32.dll", SetLastError:=True)>
    5. Private Function GetForegroundWindow() As IntPtr
    6. End Function
    7. <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)>
    8. Private Function GetWindowText(ByVal hwnd As IntPtr, ByVal lpString As StringBuilder, ByVal cch As Integer) As Integer
    9. End Function
    10. <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)>
    11. Private Function GetWindowTextLength(ByVal hwnd As IntPtr) As Integer
    12. End Function
    13. 'no specific Charset APIs
    14. <DllImport("user32.dll", SetLastError:=True)>
    15. Public Function EnumChildWindows(hWndParent As IntPtr, lpEnumFunc As EnumWindowsProc, lParam As IntPtr) As Boolean
    16. End Function
    17. Public Delegate Function EnumWindowsProc(hWnd As IntPtr, lParam As IntPtr) As Boolean
    18. <Runtime.InteropServices.DllImport("user32.dll", CharSet:=Runtime.InteropServices.CharSet.Auto)>
    19. Public Function GetClassName(ByVal hWnd As System.IntPtr, ByVal lpClassName As System.Text.StringBuilder, ByVal nMaxCount As Integer) As Integer
    20. End Function
    21. Public Function ClassName(hwnd As IntPtr) As String
    22. Dim sClassName As New StringBuilder("", 256)
    23. 'pass in the handle of the object for which to get
    24. 'the class name; for example, the form's handle
    25. Call GetClassName(hwnd, sClassName, 256)
    26. Return sClassName.ToString
    27. End Function
    28. Public Function GetActiveWindowText(hWnd As IntPtr) As String
    29. Dim length As Integer ', hWnd As IntPtr = GetForegroundWindow()
    30. If hWnd.ToInt32 = 0 Then
    31. Return Nothing
    32. End If
    33. length = GetWindowTextLength(hWnd)
    34. If length = 0 Then
    35. Return Nothing
    36. End If
    37. Dim sb As New System.Text.StringBuilder("", length)
    38. GetWindowText(hWnd, sb, sb.Capacity + 1)
    39. Return sb.ToString()
    40. End Function
    41. Private Declare Function GetWindowPlacement Lib "user32" (ByVal hwnd As IntPtr, ByRef lpwndpl As WINDOWPLACEMENT) As Integer
    42. Private Structure POINTAPI
    43. Public x As Integer
    44. Public y As Integer
    45. End Structure
    46. Private Structure RECT
    47. Public Left As Integer
    48. Public Top As Integer
    49. Public Right As Integer
    50. Public Bottom As Integer
    51. End Structure
    52. Private Structure WINDOWPLACEMENT
    53. Public Length As Integer
    54. Public flags As Integer
    55. Public showCmd As Integer
    56. Public ptMinPosition As POINTAPI
    57. Public ptMaxPosition As POINTAPI
    58. Public rcNormalPosition As RECT
    59. End Structure
    60. Public Function FensterStatus(hwnd As IntPtr) As String
    61. Dim intRet As Integer
    62. Dim wpTemp As WINDOWPLACEMENT
    63. wpTemp.Length = System.Runtime.InteropServices.Marshal.SizeOf(hwnd)
    64. intRet = GetWindowPlacement(hwnd, wpTemp)
    65. Select Case wpTemp.showCmd
    66. Case 1
    67. Return "Normal"
    68. Case 2
    69. Return "minimiert"
    70. Case 3
    71. Return "maximiert"
    72. Case Else
    73. Return "unbekannt"
    74. End Select
    75. End Function
    76. End Module

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

    Denk dran maximiert und Vollbild ist nicht das gleiche.
    Bei maximiert passt sich die Form nur an Desktop an.
    Während Form mit Vollbild unabhängig von Desktop agiert. Der Monitor visiert die Form an anstatt den Desktop. Sollte die Auflösung und/oder Hz-Frequenz anders sein wird beim um switchen zwischen Desktop und Vollbild einer Form Rechenzeit benötigt.

    Hoffe hab das richtig erklärt.

    Mein Hauptziel:
    Das will ich vermeiden in dem der Desktop sich die Auflösung der Form anpasst bis der Prozess der gewählt wurde beendet wird der Desktop nimmt die Auflösung und Hz-Frequenz wieder die vor den Start des Prozesses angewendet wurde.
    Das soll nur dann geschehen sobald sich die Anwendung tatsächlich in Vollbild befindet.
    Leider funktioniert das mit mein Code nicht bei jeden Prozess.

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

    Xiantrius schrieb:

    Habe noch nie erlebt das es eine bestimmte Klasse gebraucht wird um die funktion zu gewährleisten.


    Ich schon, wenn ich eine Klasse aus meinem Projekt lösche, wird das wohl nicht mehr kompilierfähig sein. :D Ob die API-Deklarationen in einer Form-Klasse oder Module sind, ist für die Funktionalität der Funktionen nicht entscheidend, genauso wenig der Name der Klasse/ des Modules. Aber wenn sich jeder an die Richtlinie welche @FormFollowsFunction verlinkt hält, sieht jeder Entwickler selbst wenn er das Projekt nicht kennt sofort dort ist das API-Zeugs und muss nicht das ganze Projekt durchsuchen um diese zu finden. Win32 ist auch verräterisch, so nenn ich diese bei mir, aber der Name ist auch nicht die beste Idee, weil es gibt einen Namespace mit dem Namen Win32(Microsoft.Win32).
    Hallo

    Vielleicht könntest Du die Fensterposition man verwenden, das Vollbildfenster sollte ja dann auch grösser sein als ein maximiertes Fenster..
    Ich habe leider keine Spiele zum Testen, vielleicht fällt Dir ja was auf..
    Ich habe den Code mal aktualisiert

    Spoiler anzeigen


    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Imports System.Text
    3. Module Module1
    4. <DllImport("user32.dll", SetLastError:=True)>
    5. Private Function GetForegroundWindow() As IntPtr
    6. End Function
    7. <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)>
    8. Private Function GetWindowText(ByVal hwnd As IntPtr, ByVal lpString As StringBuilder, ByVal cch As Integer) As Integer
    9. End Function
    10. <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)>
    11. Private Function GetWindowTextLength(ByVal hwnd As IntPtr) As Integer
    12. End Function
    13. 'no specific Charset APIs
    14. <DllImport("user32.dll", SetLastError:=True)>
    15. Public Function EnumChildWindows(hWndParent As IntPtr, lpEnumFunc As EnumWindowsProc, lParam As IntPtr) As Boolean
    16. End Function
    17. Public Delegate Function EnumWindowsProc(hWnd As IntPtr, lParam As IntPtr) As Boolean
    18. <Runtime.InteropServices.DllImport("user32.dll", CharSet:=Runtime.InteropServices.CharSet.Auto)>
    19. Public Function GetClassName(ByVal hWnd As System.IntPtr, ByVal lpClassName As System.Text.StringBuilder, ByVal nMaxCount As Integer) As Integer
    20. End Function
    21. Public Function ClassName(hwnd As IntPtr) As String
    22. Dim sClassName As New StringBuilder("", 256)
    23. 'pass in the handle of the object for which to get
    24. 'the class name; for example, the form's handle
    25. Call GetClassName(hwnd, sClassName, 256)
    26. Return sClassName.ToString
    27. End Function
    28. Public Function GetActiveWindowText(hWnd As IntPtr) As String
    29. Dim length As Integer ', hWnd As IntPtr = GetForegroundWindow()
    30. If hWnd.ToInt32 = 0 Then
    31. Return Nothing
    32. End If
    33. length = GetWindowTextLength(hWnd)
    34. If length = 0 Then
    35. Return Nothing
    36. End If
    37. Dim sb As New System.Text.StringBuilder("", length)
    38. GetWindowText(hWnd, sb, sb.Capacity + 1)
    39. Return sb.ToString()
    40. End Function
    41. Private Declare Function GetWindowPlacement Lib "user32" (ByVal hwnd As IntPtr, ByRef lpwndpl As WINDOWPLACEMENT) As Integer
    42. ' BOOL GetWindowRect(
    43. ' [in] HWND hWnd,
    44. ' [out] LPRECT lpRect
    45. ' );
    46. ' typedef struct tagRECT {
    47. ' Long left;
    48. ' Long top;
    49. ' Long right;
    50. ' Long bottom;
    51. '} RECT, *PRECT, *NPRECT, *LPRECT;
    52. Declare Function GetWindowRect Lib "user32.dll" (ByVal hwnd As IntPtr, ByRef lpRect As LpRect) As Int32
    53. Public Structure LpRect
    54. Public left As Int32
    55. Public top As Int32
    56. Public right As Int32
    57. Public bottom As Int32
    58. End Structure
    59. Private Structure POINTAPI
    60. Public x As Integer
    61. Public y As Integer
    62. End Structure
    63. Private Structure RECT
    64. Public Left As Integer
    65. Public Top As Integer
    66. Public Right As Integer
    67. Public Bottom As Integer
    68. End Structure
    69. Private Structure WINDOWPLACEMENT
    70. Public Length As Integer
    71. Public flags As Integer
    72. Public showCmd As Integer
    73. Public ptMinPosition As POINTAPI
    74. Public ptMaxPosition As POINTAPI
    75. Public rcNormalPosition As RECT
    76. End Structure
    77. Public Function FensterStatus(hwnd As IntPtr) As String
    78. Dim intRet As Integer
    79. Dim wpTemp As WINDOWPLACEMENT
    80. wpTemp.Length = System.Runtime.InteropServices.Marshal.SizeOf(hwnd)
    81. intRet = GetWindowPlacement(hwnd, wpTemp)
    82. Select Case wpTemp.showCmd
    83. Case 1
    84. Return "Normal"
    85. Case 2
    86. Return "minimiert"
    87. Case 3
    88. Return "maximiert"
    89. Case Else
    90. Return "unbekannt"
    91. End Select
    92. End Function
    93. End Module


    VB.NET-Quellcode

    1. Imports System.Diagnostics
    2. Imports Microsoft.VisualBasic
    3. Public Class form2
    4. Dim dt As New DataTable
    5. Dim dv As New DataView(dt)
    6. Dim Parent_Handle As IntPtr
    7. Private Sub Aktives_Fenster_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    8. With dt.Columns
    9. .Add("Handle", Type.GetType("System.Int64"))
    10. .Add("Handle_child", Type.GetType("System.Int64"))
    11. .Add("ClassName", Type.GetType("System.String"))
    12. .Add("MainWindowTitle", Type.GetType("System.String"))
    13. .Add("FensterStatus", Type.GetType("System.String"))
    14. .Add("top", Type.GetType("System.Int64"))
    15. .Add("left", Type.GetType("System.Int64"))
    16. .Add("right", Type.GetType("System.Int64"))
    17. .Add("bottom", Type.GetType("System.Int64"))
    18. End With
    19. DataGridView1.DataSource = dv
    20. Call neu_einlesen()
    21. End Sub
    22. Public Sub neu_einlesen()
    23. Dim Fensterpos As LpRect
    24. Dim Y As Boolean
    25. dt.Clear()
    26. ' alle Prozesse durchlaufen
    27. For Each oProcess As Process In Process.GetProcesses
    28. If oProcess.MainWindowHandle <> IntPtr.Zero Then
    29. Dim windowHandle As IntPtr = oProcess.MainWindowHandle
    30. Y = GetWindowRect(windowHandle, Fensterpos)
    31. Dim row As DataRow = dt.NewRow()
    32. row!Handle = windowHandle.ToString
    33. row!MainWindowTitle = GetActiveWindowText(windowHandle) 'oProcess.MainWindowTitle.ToString
    34. row!ClassName = ClassName(windowHandle)
    35. row!FensterStatus = FensterStatus(windowHandle)
    36. row!top = Fensterpos.top
    37. row!left = Fensterpos.left
    38. row!right = Fensterpos.right
    39. row!bottom = Fensterpos.bottom
    40. dt.Rows.Add(row)
    41. Parent_Handle = windowHandle
    42. GetChild(windowHandle)
    43. End If
    44. Next
    45. dv.Sort = "Handle ASC"
    46. End Sub
    47. Public Function Enumerate(hWnd As IntPtr, lParam As IntPtr) As Boolean
    48. Dim row As DataRow = dt.NewRow()
    49. Dim Fensterpos As LpRect
    50. Dim Y As Boolean
    51. Y = GetWindowRect(hWnd, Fensterpos)
    52. row!Handle = Parent_Handle.ToInt64
    53. row!Handle_child = CInt(hWnd.ToString)
    54. row!Classname = ClassName(hWnd)
    55. row!MainWindowTitle = GetActiveWindowText(hWnd)
    56. row!FensterStatus = FensterStatus(hWnd)
    57. row!top = Fensterpos.top
    58. row!left = Fensterpos.left
    59. row!right = Fensterpos.right
    60. row!bottom = Fensterpos.bottom
    61. dt.Rows.Add(row)
    62. Return True
    63. End Function
    64. Public Function GetChild(hwnd As IntPtr) As Boolean
    65. Dim x As Boolean
    66. x = EnumChildWindows(hwnd, AddressOf Enumerate, CType(0, IntPtr))
    67. Return True
    68. End Function
    69. Private Sub bt_neu_einlesen_Click(sender As Object, e As EventArgs) Handles bt_neu_einlesen.Click
    70. Call neu_einlesen()
    71. End Sub
    72. End Class



    Habe auch spiele die auf 640x480 Vollbild nutzen.
    Bin gerade auf derArbeit.

    So hab nochmal alles durch gecheckt und muss etwas peinliches feststellen...
    Die Spiele die ich dachte die nicht greifen gehen werden doch als Vollbildmodus gewertet, habe nicht bedacht, dass manche Spiele offenbar key blockieren in Windows solange sie in Vordergrund sind.
    Das heist ich hatte ein Bedienungsfehler gemacht ohne es zu wollen, tut mir wirklich leid, aber umsonst war es ja nicht.
    War mir schon die ganze Zeit schleierhaft warum die Spiele dann immer als minimiert gezählt wurden obwohl ich in vollbild die richtigen tasten kombi gedrückt habe und manche war das problemlos.
    Bin soooo......... so blöd.
    Hab dann eine abfrage einfach gemacht, wenn Vollbild registriert wird in Timer soll er Timer anhalten und Msgbox dazu ausgeben um es zu bestätigen hab den Timer hinterher mit ein Button wieder gestartet für den nexten Test. Alles funktionierte...
    Sollte es mal ein Spiel geben wo es wirklich nicht greift, werde ich mich nochmal melden deswegen.
    Das bedeutet der Post 51 mein Code hat funktioniert ohne probleme und das nur weil ich jetzt mein Fehler erkannt habe.

    Dennoch gibt es 1 Positiven effekt, man kann ja Enumchild für was anderes einsetzen.
    Vielleicht kann man Enumchild und alle API's die dazugehören wirklich mal gut gebrauchen.
    Bisher hat es heute jedes Spiel das in Vollbild Modus lief erfolgreich getestet ohne das ich Enumchild API brauche.
    Naja trotz allem gab es noch kniffe wie man Datagridview durch Datatable anwendet und Datasource weis ich das es so eine art verknüpfung dazu erzeugt von der tatsächlichen tabelle in die Verknüpfung Datagridview usw...
    Also waren unsere Zeiten nicht ganz umsonst in gewisser weise.

    Aber das Thread ist ja nicht zuende deswegen. Man könnte noch andere API's anschauen die interessant wären.
    Ihr könnt euch auch untereinander wenn es um dieses Thema geht austauschen.

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

    @Xiantrius, Du solltest die beiden, von mir verlinkten Seiten mal lesen, "NativeMethods" ist nicht einfach nur nen sexi Name. ;)

    Regelbeschreibung
    Plattformaufrufmethoden, beispielsweise Methoden, die mit dem System.Runtime.InteropServices.DllImportAttribute-Attribut gekennzeichnet sind, oder Methoden, die in Visual Basic mithilfe des Declare-Schlüsselworts
    definiert wurden, greifen auf nicht verwalteten Code zu. Diese Methoden
    sollten in einer der folgenden Klassen vorhanden sein:

    NativeMethods: Diese Klasse unterdrückt keine Stackwalks für die nicht verwaltete Codeberechtigung. (System.Security.SuppressUnmanagedCodeSecurityAttribute
    darf nicht auf diese Klasse angewendet werden.) Diese Klasse eignet
    sich für Methoden, die überall verwendet werden können, da ein Stackwalk
    ausgeführt wird.

    SafeNativeMethods: Diese Klasse unterdrückt Stackwalks für die nicht verwaltete Codeberechtigung. (System.Security.SuppressUnmanagedCodeSecurityAttribute
    wird auf diese Klasse angewendet.) Diese Klasse eignet sich für
    Methoden, die für jeden aufzurufenden Benutzer sicher sind. Aufrufer
    dieser Methoden müssen keine vollständige Sicherheitsüberprüfung
    durchführen, um sicherzustellen, dass die Nutzung sicher ist, da die
    Methoden für jeden Aufrufer harmlos sind.

    UnsafeNativeMethods: Diese Klasse unterdrückt Stackwalks für die nicht verwaltete Codeberechtigung. (System.Security.SuppressUnmanagedCodeSecurityAttribute
    wird auf diese Klasse angewendet.) Diese Klasse eignet sich für
    Methoden, die potenziell gefährlich sind. Alle Aufrufer dieser Methoden
    müssen eine vollständige Sicherheitsüberprüfung durchführen, um
    sicherzustellen, dass die Nutzung sicher ist, da kein Stackwalk
    durchgeführt wird.
    Klingt interessant... aber was wäre so schlimm ein Class Name zu nehmen der nicht der vorgegebenen Anforderung entspricht, oder was ist wenn ich Modul statt Class bevorzuge? Ist ja auch tatsächlich der fall.

    Neu

    Guten morgen zusammen,

    Ich hab gelesen das

    VB.NET-Quellcode

    1. SuppressUnmanagedCodeSecurityAttribute
    die Laufzeit verbessert und Leistungseinsparung gibt.
    Wie verwende ich das?
    Ausserdem lese ich grade was interessantes docs.microsoft.com/de-de/dotne…ityattribute?view=net-6.0

    Wichtig:
    Teilweise vertrauenswürdiger Code wird nicht mehr unterstützt. Dieses Attribut hat keinen Effekt in .NET Core.


    Achtung:
    Verwenden Sie dieses Attribut mit extremer Sorgfalt. Falsche Verwendung kann Sicherheitsschwächen schaffen.

    Ok so wendet man es also an...

    VB.NET-Quellcode

    1. <System.AttributeUsage(System.AttributeTargets.[Class] Or System.AttributeTargets.[Delegate] Or System.AttributeTargets.[Interface] Or System.AttributeTargets.Method, AllowMultiple:=True, Inherited:=False)>
    2. Public NotInheritable Class SuppressUnmanagedCodeSecurityAttribute
    3. Inherits Attribute
    4. Private Sub Test123(value As Int32)
    5. For i As Integer = 0 to value
    6. 'Irgendwas soll passieren
    7. Next
    8. End Sub
    9. End Class

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