Diskussionen etc. zu Snippets

  • let WndID = GetIDByWindow(hWnd)

    Das passiert, wenn man das Bsp. nicht testet: 8o

    Code
    {
        ...
        "severity": 8,
        "message": "redefinition of 'WndID'; previous declaration here: c:\\Users\\ghost\\NIM\\@BugFix\\GetIDByWindow.nim(6, 3)\r\n\r\n",
        ...
    }

    Tags: <Process ID>, <PID>, <Thread ID>

  • BugFix 7. Juni 2020 um 12:47

    Hat das Label Nim hinzugefügt.
  • txtlen = GetWindowTextW(hwnd, cast[LPWSTR](addr buf[0]), buflen)

    classlen = GetClassNameW(hwnd, cast[LPWSTR](className), 4096)

    EnumWindows... die beiden Variablen werden sonst an keiner Stelle verwendet... da muss du noch mal gucken...

    • Offizieller Beitrag

    EnumWindows... die beiden Variablen werden sonst an keiner Stelle verwendet... da muss du noch mal gucken...

    Das ist Absicht. In vielen Fällen meckert der Compiler, wenn du den Rückgabewert einer Funktion nicht auffängst. Deshalb habe ich mir das so angenommen.

  • Das ist Absicht. In vielen Fällen meckert der Compiler, wenn du den Rückgabewert einer Funktion nicht auffängst. Deshalb habe ich mir das so angenommen.

    Ich habe es hin bekommen... er meckert nicht mehr... und die Ausgabe formatiert... passt allerdings nicht alles in eine Zeile, deshalb habe ich es auf drei umgebrochen.

    Diese Funktion holt aber wohl alle Windows, auch die Childs bzw. Controls... daran erkennbar, weil etliche Windows dieselbe PID/TID haben.

    2 Mal editiert, zuletzt von Bitnugger (10. Juni 2020 um 08:55) aus folgendem Grund: TITLE und CLASSNAME waren bei der Ausgabe vertauscht... habe es korrigiert.

    • Offizieller Beitrag

    Diese Funktion holt aber wohl alle Windows, auch die Childs bzw. Controls... daran erkennbar, weil etliche Windows dieselbe PID/TID haben.

    Laut MSDN:

    Zitat

    EnumWindows continues until the last top-level window is enumerated or the callback function returns FALSE.

    Ich habe testweise den DLL-Aufruf nochmal selbst in einer Funktion erstellt - liefert dieselbe Anzahl. Vielleicht verwendet die AutoIt Funktion stattdessen EnumDesktopWindows. Allerdings braucht diese Funktion ein Desktop Handle. Habe ich mir noch nicht weiter angesehen.

    EDIT:

    Habe es mal getestet. Alle mit EnumWindows gefundenen Fenster verwenden dasselbe Desktop-Handle, somit wird EnumDesktopWindows dasselbe Ergebnis liefern.

    EDIT2:

    Ich habe mal noch gefiltert:

    - Parent muss "0" sein

    - Fenster muss Titel haben

    Das schmilzt die Sache deutlich zusammen.


    Ich habe es hin bekommen... er meckert nicht mehr

    :Face:Habe ich schon so oft in den Beschreibungen gelesen: "must be discarded". Einfach auch mal dran denken. ^^

  • Mit AutoIt: 212

    Mit Nim: 897

    Vielleicht verwendet die AutoIt Funktion stattdessen EnumDesktopWindows.

    _WinAPI_GetDesktopWindow() und dann __WinAPI_EnumWindowsChild... ===>>> _WinAPI_GetWindow / [_WinAPI_IsWindowVisible] / _WinAPI_GetWindow ...ist klar, sind ja alle Childs des Desktops...

    Mit Nim kannst du die aber sicher auch filtern...

    • Offizieller Beitrag

    className = newWideCString("", 4096)

    Du reservierst für den Classname 4096 Bytes. Das brauchst Du nicht! Der Classname darf max. 256 Bytes lang sein:

    Zitat


    The maximum length for lpszClassName is 256. If lpszClassName is greater than the maximum length, the RegisterClass function will fail.

    Siehe: https://docs.microsoft.com/en-us/windows/…nuser-wndclassw

  • Bei Nim benutze ich allerdings auch die aktuelle Version (v1.2.6).

    Daran lag es!

    scoop update nim ; Umgebungsvariable Path korrigieren: C:\Users\ghost\scoop\apps\nim\1.2.6\bin

    Danach ging nichts mehr, weil der Compiler (gcc.exe) nicht mehr gefunden wurde. Habe die beiden Verzeichnisse dann manuell nach c:\Users\Ghost\scoop\apps\nim\current\dist\ kopiert.

    mingw32\

    mingw64\