Probleme mit globalem WH_CBT


  • Mod

    So in etwa:

    #define IS_ATOM(a) ((((ULONG_PTR)(a)) >> 16) == 0)
    


  • danke, ich werde das gleich mal einbauen... wobei mir fällt gerade auf dass das ja jetzt nur für die Fensterklasse gilt...
    muss ich das beim Fenstertitel denn auch machen? Denn der Absturz der explorer.exe war immer sobald ich auf lpszName zugegriffen habe...

    naja ich probier es mal aus...

    edit2: also der Code in der HookProc sieht momentan so aus:

    case HCBT_CREATEWND:
    		{
    			CBT_CREATEWNDA* cw= reinterpret_cast<CBT_CREATEWNDA*> (lparam);
    
    			if(cw->lpcs->hwndParent==0)//nur parents
    			{
    				if(cw->lpcs->lpszName==NULL)//null-pointer
    				{
    					MessageBeep(1);
    				}
    				else if(IS_ATOM(cw->lpcs->lpszName))//ATOM*
    				{
    					ATOM* a= (ATOM*) cw->lpcs->lpszName;
    
    					if(strcmp((char*) a, "testfenster")==0)
    					{
    						MessageBoxA(0, "Testfenster erstellt!", "dll", MB_OK);
    					}
    				}
    				else//char*
    				{
    					if(strcmp(cw->lpcs->lpszName, "testfenster")==0)
    					{
    						MessageBoxA(0, "testfenster erstellt!", "dll", MB_OK);
    					}
    				}
    			}
    
    		}
    		break;
    

    dadurch habe ich jetzt herausgefunden, dass immer ein Nullpointer beim Fensternamen übergeben wird, weil immer das "Bing" beim Erstellen eines Fensters zu hören ist 😮

    mache ich irgendetwas falsch? immerhin sollte da doch der korrekte Fenstername ankommen?!

    wie kommt man denn nun an den Titel des zu erstellenden Fensters? in der CREATESTRUCT ist ja nur ein NULL-Pointer 😕


  • Mod

    Da habe ich gar nicht darauf geachtet.
    Nein! Der Fenster Titel kann kein ATOM sein... Schau in die Doku.

    Aber evtl. ist ein NULL Zeiger für den Titel erlabt...



  • edit2:

    also also ich habe jetzt den Code etwas geädert:

    case HCBT_CREATEWND:
    		{
    			CBT_CREATEWNDA* cw= reinterpret_cast<CBT_CREATEWNDA*> (lp);
    
    			if(cw->lpcs->hwndParent==0)//nur parents
    			{
    				if(cw->lpcs->lpszName==NULL)
    				{
    					//MessageBeep(1);
    				}
    				else
    				{
    					MessageBeep(1);
    
    					char buf[1000];
    strcpy(buf, cw->lpcs->lpszName);
    MessageBoxA(0, buf, "neues fenster", MB_OK);				}
    			}
    
    		}
    		break;
    

    es kommt jetzt kein nullpointer oder absturz mehr, allerdings kommt ein pointer bei name auf einen leeren char-wert an... ist da noch ein Fehler im Code? Da müsste doch der entsprechende Fenstertitel enthalten sein...


  • Mod

    Ein Titel von einem Fenster darf doch leer sein. Evtl. wird er später erst gesetzt.



  • Ja, er darf schon leer sein...
    Aber wie kann ich denn dann an den Fenstertitel des zu erstellenden Fensters kommen?

    ich habe es auch schon so versucht:

    case CHBT_CREATEWND:
    {
    HWND hwnd=(HWND) wparam;
    
    char titel[200];
    GetWindowTextA(hwnd, titel, 200);
    }
    break;
    

    leider auch hier kein Erfolg, es kommt nur ein leerer Fenstertitel zurück...

    es muss doch einen Weg geben, an den Titel des Fensters zu kommen, das erstellt wird?

    Geht es vielleicht über die Fensterklasse in der CREATESTRUCT? Damit müsste man wenigstens einigermaßen feststellen können, welches Fenster erstellte wird...

    Übrigens falls es einen besseren Weg als einen globalen WH_CBT gibt nehme ich den gerne, es geht nur darum mitzubekommen, wenn ein bestimmtes Fenster geöffnet wird...

    Wie kann ich denn an den Titel des zu erstellenden Fensters herankommen?


  • Mod

    Nein! Du hast keien Chance wenn das Fenster eben später erst seinen Titel bekommt.
    Man kann ein "leeeres" Fenster erzeugen. Den Titel bekommt es später evtl. erst gesetzt durch SetWindowText...



  • ok... schade, also mit einem WH_CBT geht es tatsächlich nicht mitzubekommen wann ein bestimmtes Fenster erstellt wird.

    Vermutlich gibt es auch keinen anderen Weg um das mitzubekommen, oder? (Also natürlich außer permanent FindWindow() aufzurufen)

    trotzdem schonmal danke für die Hilfe,
    andi01.


  • Mod

    Sicher bekommst Du mit wann ein "bestimmtes" Fenster erzeugt wird. Nur bekommst Du es nicht über die Caption heraus.
    Evtl. hilft Die der Kontext. Welche Klasse ist es, welchen Namen/Klasse hat das Parent... etc.



  • stimmt, über die Fensterklasse müsste es gehen... wie gut, dass ich ja von oben schon weiß wie es damit geht 😃 ich probiere das mal eben aus...

    nur leider ist das parent der desktop, d.h. über parent fenstername/klasse komme ich erstmal nicht weiter. Aber mit der Fensterklasse in der CREATESTRUCT sollte es funktionieren 🙂


Anmelden zum Antworten