Hej. Ja robiłem jedynie prosty plugin który pomagał poprawiać mi @kAzek ale i tak kaszaniły się właśnie modyfikowane kontrolki przez wycieki GDI. Nie będę się dużo powtarzał, że u mnie teraz pasja do klepania całymi dniami kodów i udzielania się regularnie też na tym forum przekuła się w mocną wkrętkę w amatorsko uprawiany sport więc gdyby nie oznaczenie mnie i mail który trafił do spamu o dziwo to bym się nie pokapował że coś potrzeba ode mnie :)
A zatem ja bym sprawdził czy któryś z pluginów ładuje się w momencie startu programu, bo tutaj może być problem. Plugin ładuje się pierwszy raz chyba tylko wtedy kiedy go potrzeba. Czyli mój odtwarzacz modułów ładował się po wybraniu Ctrl+Q i "najechaniu" kursorem na odpowiedni typ pliku (.mod/.xm/*.s3m itd) który mój plugin dodatkowo sprawdzał po rozszerzeniu. Plugin systemu plików ładuje się pewnie tylko kiedy wybierzemy "\" z listy dysków, natomiast plugin do archiwów w momencie obsługi archiwum. Mogę się mylić, ale chyba tak było i nadal jest, bo inaczej ubijalibyśmy sobie wiadome okienko na przykład z przyciskami 1, 2 i 3 ;) Jednak jeżeli się mylę to wtedy "podczepiamy" się naszą wtyczką po jej załadowaniu pod główne okno programów i obsługę komunikatów, przechwytując odpowiedni komunikat WM_QUIT czy podobne robimy co trzeba.
Oczywiście jeżeli plugin FileSystemowy ładuje się tylko kiedy pokaże się drzewko gdzie mamy też nasz czy inne komputery w sieci lokalnej, drukarki itd to jest gdzieś w opcjach (nigdy nie umiem tego znaleźć więc modyfikuje jak potrzeba wincmd.ini bo raz to znalazłem i teraz nie umiem) możliwość podania ścieżki dla lewego i prawego panelu po tym jak się uruchomi Total Commander.
Czyli na przykład w sekcji "left" tego pliku ini podajemy path=\\Task manager czy \\nasza_wtyczka i wtyczka ładuje się robiąc "podczepienie" w pętle obsługi komunikatów okna głównego. Co uda się nawet bez praw admina, bo to nie jest iniekcja dllki w proces zewnętrzny a ładowanie dllki pluginu przez program powoduje że jej kod ma też dostęp odpowiednimi metodami do jej okna, czytania oraz pisania po pamięci tego procesu itd.
Inne nieco "brzydkie" i toporne ale skuteczne wydaje się mi rozwiązanie to zrobienie sobie programu działającego w tle lub usługi która będzie sprawdzała czy aktualne okno na wierzchy ma klasę TTOTAL_CMD i jeśli tak sprawdzi uchwyt okna i odczyta z tego odpowiednimi funkcjami PID procesu. Następnie mając to ustalone sprawdza ten PID czy proces istnieje, ewentualnie jeżeli mamy inne okno z tą klasą to ponownie odczyta ten PID i jeśli nagle po na przykład 500 - 1000 milisekund pętli nie ma procesu o tym PID który program ustalił to znaczy że coś lub sam user program zamknął i należy wykonać czynności na których zależy autorowi tego wątku. Tak bym kombinował. Sorki że trochę zawile i rozpisane, jak to ja :D I jeśli coś nie jasne to proszę dopytać.
EDIT: aaa :) No teraz doczytałem że czynność ma być tuż przed zamknięciem, no to można zwrócić przy komunikacie wartość inną niż 1 i przerwać pętlę obsługi oryginalnych komunikatów, dokonać wywołania tych poleceń wewnętrznych do czego są odpowiednie metody komunikatów dla samego Total Commandera opisane zdaje się w dokumentacji czy przykładach wtyczek i na nowo wysłać komunikat do zamknięcia okna nie przechwytując go już i myślę że program się zamknie. Ale czy i jak to zadziała tego nie wiem. Nie mam teraz jak to sprawdzić. Ewentualnie może próba dywagacji na forum z Autorem i innymi userami sprawi, że doda on sam odpowiedni feature lub ktoś coś Ci doradzi co do zapisywania. Bo może się nagle okaże że ktoś kombinował już pluginami tak jak piszę i nie musisz sam rzeźbić tego od zera o ile taka osoba podzieliła się swoim kodem lub skompilowaną wtyczką.