Imagelist eines dritten Gui App kann nicht ausgelesen werden.



  • Ich wollte mal aus Lernzwecken die Icons von Toolbar herauszulesen. Doch ich bin gerade auf ein Problem gestoßen, was ich logisch nicht so richtig verstehe.

    auto frmStdHandle = FindWindowEx( mHandle, 0, _T( "AfxControlBar140s" ), _T( "Standard" ) );
    auto tbStdHandle = FindWindowEx( frmStdHandle, 0, TOOLBARCLASSNAME, _T( "Standard" ) );
    auto imgCount = SendMessage( tbStdHandle, TB_GETIMAGELISTCOUNT, 0, 0 );
    auto imgHandle1 = ( HIMAGELIST ) SendMessage( tbStdHandle, TB_GETIMAGELIST, 0, 0 );// does not work yet
    auto imgHandle2 = ( HIMAGELIST ) SendMessage( tbStdHandle, TB_GETHOTIMAGELIST, 0, 0 );// does not work yet
    auto imgHandle3 = ( HIMAGELIST ) SendMessage( tbStdHandle, TB_GETDISABLEDIMAGELIST, 0, 0 );// does not work yet
    auto hIcon = ImageList_GetIcon( imgHandle1, 0, ILD_NORMAL );
    auto i = 0;
    

    Alle Windows Handle (mHandle, frmStdHandle, tbStdHandle) wurden gefunden. ImageList Anzahl wurde hier ebenfalls ein gefunden. Nur image Handle 1, 2 und 3 return leider alle NULL zurück.

    Ich habe selbst ein Beispiel Example erstellt mit Toolbar, bei mir konnte zumindest image handle zurückgegeben werden. Wie kann man das verstehen, geht es eigentlich Toolbar mit Icon ohne Imagelist, aber TB_GETIMAGELISTCOUNT gibt aber 1 zurück.

    Dann die zweite Frage, ich habe unter Spy++ andere ToolbarWindow32 gesehen, dort gibt es ein Caption Feld, das befüllt ist, bei mir habe ich auch Caption als "Standard" befüllt, in Spy++ ist mein Toolbar Caption jedoch leer, fehlt hier ein Flag bei dwStyle zum Setzen des Caption?

    // Create the toolbar.
    hWndToolbar = CreateWindowEx( 0, TOOLBARCLASSNAME, _T( "Standard" ),
                                       WS_CHILD | TBSTYLE_WRAPABLE, 0, 0, 0, 0,
                                       hWndParent, nullptr, hInst, nullptr );
    


  • @JnZn558 Nur so ein Bauchgefühl: Schau mal mit GetLastError, ob da vielleicht irgendwo ein Fehler auftritt. Ich bin kein Spezialist auf dem Gebiet, könnte mir aber gut vorstellen, dass Messages an andere Anwendungen zu schicken aus Sicherheitsgründen gewissen Einschränkungen unterliegt. Da gibt es unter Windows wohl Mechanismus, der sich UIPI nennt und der verhindert, dass beliebige UI-Messages an Fenster gesendet bzw. von diesen empfangen werden können, wenn diese nicht dem aktuellen Thread gehören.

    Kann natürlich auch an etwas anderem liegen, das würde ich aber erstmal ausschliessen.


  • Mod

    1. Aus fremden Prozessen nützt Dir so ein Handle nichts. Diese Imagelist liegt im Prozess des anderen Programms.
    2. Ein Toolbar selbst hat keine Caption. Zumindest keine die angezeigt wird.
      Wenn ein Toolbar eine Caption im ungedockten Zustand hat, dann ist das meistens ein eigenes Fenster, dass den Toolbar selbst beinhaltet.
      Bei vielen Fenstern wird die Caption / bzw. der mögliche und immer vorhandene Windows Text nicht benutzt.


  • @Finnegan sagte in Imagelist eines dritten Gui App kann nicht ausgelesen werden.:

    @JnZn558 Nur so ein Bauchgefühl: Schau mal mit GetLastError, ob da vielleicht irgendwo ein Fehler auftritt. Ich bin kein Spezialist auf dem Gebiet, könnte mir aber gut vorstellen, dass Messages an andere Anwendungen zu schicken aus Sicherheitsgründen gewissen Einschränkungen unterliegt. Da gibt es unter Windows wohl Mechanismus, der sich UIPI nennt und der verhindert, dass beliebige UI-Messages an Fenster gesendet bzw. von diesen empfangen werden können, wenn diese nicht dem aktuellen Thread gehören.

    Kann natürlich auch an etwas anderem liegen, das würde ich aber erstmal ausschliessen.

    Ich habe den Errorcode 6 erhalten, also ERROR_INVALID_HANDLE, wie soll man das logisch verstehen?

    Diesen Befehl funktioniert,

    auto imgCount = SendMessage( tbStdHandle, TB_GETIMAGELISTCOUNT, 0, 0 );
    

    Aber das hier ERROR_INVALID_HANDLE, es ist doch das selben Window Handle.

    auto imgHandle1 = ( HIMAGELIST ) SendMessage( tbStdHandle, TB_GETIMAGELIST, 0, 0 );
    


  • @Martin-Richter

    • Das heisst, es ist in der Form nicht möglich Imagelist aus fremden Prozessen herauszulesen. Hast Du irgendwie ein hilfreichen Ansatzpunkt wie man das zu bewerkstelligen kann? Ein Paar Stichpunkt würde mir helfen, danach zu recherchieren. Wenn Du zufälligerweise einen Technical Artikel hast, wäre es noch besser.

    • In Spy++ habe ich auch andere App gesehen, dass dort ToolbarWindows32 im Einsatz haben, die ein WIndows Caption haben, daher wundere ich mich, wie die das machen, ich dachte da an Windows Ex Style oder Windows Style.

    • Wie kann man hier in Forum Bild einfügen?



  • Probier mal, ob du mit Resource Hacker an die Grafiken kommst.


  • Mod

    Was willst Du mit der Windows Caption von einem Toolbar?
    Ich wüsste nicht ein Beispiel, in dem eine Toolbar eine Caption hat. Zeig mir eines, ich habe es evtl. übersehen.
    Oder meinst Du ein Rebar? https://learn.microsoft.com/de-de/windows/win32/controls/rebar-controls

    GDI und ComCtrl Objekte liegen nicht in irgendeinem systemweit verfügbaren Speicher. Wenn Du direkt an die ran willst musst Du Dich in dem Projekt befinden. Also Beispielsweise ein DLL injizieren etc.

    Für mich eher die Frage:
    "Was willst Du hacken?"
    "Warum kommst Du auf die Idee an eine Imagelist eines fremden Prozesses heran zu kommen?"

    Ich kann auch keine Grafiken einfügen... (Nicht genügend Berechtigungen) musst halt ein externen Provider für das Bildhochladen verwenden...



  • @Martin-Richter

    "Was willst Du hacken?" Kein hacken
    "Warum kommst Du auf die Idee an eine Imagelist eines fremden Prozesses heran zu kommen?"
    Mich interessiert nur die Möglichkeit, in fremden Process zu analsieren auf Basis Openprocess und ReadMemory and alle Möglichkeiten des Auslesen der Resourcen.

    Hier ist ein Screenshot von Spy++, wo Toolbarwindows32 ein Windows Caption hat, wo ich selbst nicht reproduzieren kann.

    Spy++ Screenshot - https://ibb.co/C201kQb


  • Mod

    Also man kommt nicht ran. Genauso wenig, wie Du an einen HDC oder sonst welche andere Objekte rankommst.

    Das eine Caption vorhanden ist (also ein Text gespeichert wurde) heißt nicht, dass da was angezeigt wird.
    Jedes Fenster hat einen Fenstertext (Caption) ob es den verwendet oder anzeigt oder sonst wie benutzt ist die Sache des Fensters selbst.

    Bevor Du so etwas fragst lerne erstmal was über die Windows Basics, oder erkläre Deine Intention von Anfang an.
    Dann antworte ich auch nicht mehr... 😉



  • @Martin-Richter

    Vielen Danke, ich habe die Windows Basic schon gelernt. Es geht nicht um die Anzeige des Caption selbst, es geht nur darum, dass ich selbst ein Beispiel Gui App mit ToolbarWindow32 und Imagelist erstellt habe. In Beispiel Gui App habe ich den Text bei der Funktion CreateWindowEx bei Toolbarwindow32 gesetzt, diese ist in Spy++ nicht zu sehen, so wie in Screenshot von andere App der Fall ist. Jedoch bekomme ich in Beispiel App den Handle von den Imagelist. Logisch kann ich es zwar nicht nachvollziehen, daher habe ich die Frage hier in Forum gestellt.


Anmelden zum Antworten