Fremdes Lable umfärben via WinAPI/Hooks



  • Hallo Leute,

    ich stoße gerade an eine Wissensgrenze und weiß nicht mehr weiter. Ich schreibe gerade ein Plugin für ein Programm bei dem ich ein Lable oder auch Static wie Spy++ sagt umfärben.

    Meine dll wird also im selben Thread ausgeführt wie die GUI die ich manipulieren will. Die Hintergrundfarbe der Lables soll mal wohl mit SetBkColor ändern können. Was aber dieses "device context" ist müsste mir auch mal jemand erklären. Auf jeden Fall kann man das wohl mit GetDC und dem Handle des Controls machen.

    Soweit so gut, nur die beiden Funktionen alleine reichen nicht!

    Man muss wohl die Farbe gezielt in der MessageLoop austauschen bei der WM_CTLCOLORSTATIC Nachricht. Darauf habe ich natürlich keinen Zugriff, aber es gibt ja zum glück noch die Hooks. Mit SetWindowsHookEx erzeuge ich einen Hook, aber ich bekomme nicht das gewünschte Event. Kann mir da jemand helfen?

    Zum Schluss noch ein bisschen C++ Code, den ich aktuell verwende.

    extern "C" BOOL WINAPI _DllMainCRTStartup(HMODULE hInst,UINT Reason,LPVOID lpReserved) {
    	SetWindowsHookExA(WH_SYSMSGFILTER, MessageHook, (HINSTANCE) hInst, 0);
    	return TRUE;
    }
    
    LRESULT CALLBACK MessageHook(int code, WPARAM wp, LPARAM lp) {
    	PMSG m=(PMSG)lp;
    	if(m->message == WM_CTLCOLORSTATIC)
    		ColorHook(m->wParam, m->lParam);
    	FILE *fp=fopen("hook.log", "a+");
    	fprintf(fp, "event: %04x wp: %08x lp: %08x\n", m->message, m->wParam, m->lParam);
    	fclose(fp);
    	return CallNextHookEx(0, code, wp, lp);
    }
    
    void ColorHook(WPARAM wp, LPARAM lp) {
    	MessageBox(0, "Das Umfärben kann beginnen...", "Debug", 0);
    }
    


  • Die Lösung: Man achte dadrauf das sein Modul nicht sofort entladen wird dann geht das Ganze auch 🙂

    Mein Hook hat nach der Speicherfreigabe auf freigegeben Speicher gezeigt was dann natürlich zu einem Crash führt.

    *close*


Anmelden zum Antworten