Handle etc ermitteln



  • Hallo Leute!

    Ich bins wieder 😃 .

    Welche Parameter brauche ich für Findwindow bzw wie heissen diese?

    vielen Dank





  • Hmmmm das hab ich schon mal

    #include <windows.h>
    
    int WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow)
    {
    
    	MessageBoxEx(NULL,(LPCTSTR)"Der OK-Button-klicker für MSN läuft jetzt im Hintergrund",(LPCTSTR)"^_^", NULL, NULL);
    
    	while (TRUE) {
    
    		HWND w = FindWindowEx(NULL,NULL,NULL,(LPCTSTR)"Windows Live Messenger");
    		if (w == NULL) {
    			Sleep(100);
    			continue;
    		}
    
    		// wähle alles erlauben aus
    		HWND cb = FindWindowEx(w, NULL, NULL, (LPCTSTR)"&Anmelden");
    		if (cb == NULL) {
    			MessageBoxEx(NULL,(LPCTSTR)"Kann den zulassen Button nicht finden!",(LPCTSTR)"Geht ned :-/", NULL, NULL);
    			return 1;
    		}
    
    		// auf zulassen klicken
    		SendMessage(cb,WM_LBUTTONDOWN,NULL,NULL);
    		SendMessage(cb,WM_LBUTTONUP,NULL,NULL);
    
    	}
    
    	return 0;
    }
    

    , nur leider bekomm ich so oft

    I:\Dokumente und Einstellungen\Muhammed.NONE-GIH0BS3O7L\Eigene Dateien\Klicker.c(23): error #2140: Type error in argument 4 to a function; found 'void *' expected 'unsigned int'.

    und weiss ned was ich da ändern soll.

    K habs jetzt nur leider funzt es noch ned, ich hoffe jmd kann mir helfen, so sieht der Code inzwischen aus (der jetzt syntaktisch richtig ist)

    #include <windows.h>
    
    int WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow)
    {
    
    	MessageBoxEx(NULL,(LPCTSTR)"Der OK-Button-klicker für MSN läuft jetzt im Hintergrund",(LPCTSTR)"^_^", 0,0);
    
    	while (TRUE) {
    
    		HWND w = FindWindowEx(NULL,NULL,NULL,(LPCTSTR)"Windows Live Messenger");
    		if (w == NULL) {
    			Sleep(100);
    			continue;
    		}
    
    		// wähle alles erlauben aus
    		HWND cb = FindWindowEx(w, NULL, NULL, (LPCTSTR)"&Anmelden");
    		if (cb == NULL) {
    			MessageBoxEx(NULL,(LPCTSTR)"Kann den zulassen Button nicht finden!",(LPCTSTR)"Geht ned :-/", 0, 0);
    			return 1;
    		}
    
    		// auf zulassen klicken
    		SendMessage(cb,WM_LBUTTONDOWN,0,0);
    		SendMessage(cb,WM_LBUTTONUP,0,0);
    
    	}
    
    	return 0;
    }
    

    [b]EDIT[b]: Das sind die Fenster-Daten des MSN-Messengers

    Window Handle == 0x0009015E. (ändert sich natürlich immer)
    Class Name : DirectUIHWND.
    RECT.left == 586.
    RECT.top == 27.
    RECT.right == 882.
    RECT.bottom == 550.



  • Was funzt denn nicht?? Findet er eins der Fenster nicht, oder findet er beide und macht gar nichts?

    Falls das der Fehler sein sollte: FindWindowEx sucht nur nach Child-Fenstern, also Buttons, Edit-Feldern und so weiter. Um ein "normales" Fenster zu finden, nimm FindWindow 😉



  • Hi, er findet den Button nicht 😞 Hmm viell aber auch das Fenster bitte helft mir!

    EDIT:

    OK das Fenster findet er!

    Leider aber nicht den Button!

    2nd EDIT:

    Ok hab jetzt den Handle ermittelt (extern per Programm, wär aber schön wenn mir jmd zeigen könnte wie ich das mache!)

    und den auch eingetragen nur leider funzt es immer noch nicht.

    #include <windows.h>
    
    int WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow)
    {
    
    	MessageBoxEx(NULL,(LPCTSTR)"Der OK-Button-klicker für MSN läuft jetzt im Hintergrund",(LPCTSTR)"^_^", 0,0);
    
    	while (TRUE) {
    
    		HWND w = FindWindow((LPCSTR) "MSBLWindowClass",(LPCSTR)"Windows Live Messenger");
    
    //(LPCTSTR)"MSBLWindowClass",(LPCTSTR)"Windows Live Messenger");
    
    		if (w == NULL) {
    			Sleep(100);
    MessageBoxEx(NULL,(LPCTSTR)"SHIT",(LPCTSTR)"", 0,0);
    			continue; 
    		}
    //DirectUIHWND
    		// wähle alles erlauben aus
    		HWND cb = FindWindowEx(w, 0, "DirectUIHWND", NULL);
    		//FindWindowEx(w,NULL,NULL,(LPCSTR)"&Anmelden");
    		if (cb == NULL) {
    			MessageBoxEx(NULL,(LPCTSTR)"Kann den zulassen Button nicht finden!",(LPCTSTR)"Geht ned :-/", 0, 0);
    			return 1;
    		}
    else
    		// auf zulassen klicken
    		SendMessage(cb,WM_LBUTTONDOWN,0,0);
    		SendMessage(cb,WM_LBUTTONUP,0,0);
    
    	}
    
    	return 0;
    }
    


  • Ok, hab jetzt durch Überlegen herausgefunden, dass der Button vermutlich ein Grandchildren ist und ich daher einen Handle vom child brauche den ich mir auch geholt habe.

    Bin aber wegen der Parameter etwas orientierungslos ( 😃 liegt viell daran dass es fast halb vier in der Früh ist)

    Hmm ihr seht ich hab mich bemüht, hab drei grobe Fehlerquellen/Fragen geschafft, vielleicht könnt ihr mir ja bei den Parametern helfen.

    Thx
    Hier mal ne "Rohfassung" (soll heissen einige Fehler können vorkommen da ich ein wenig rumexperimentiert habe)

    #include <windows.h>
    
    int WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow)
    {
    
    	MessageBoxEx(NULL,(LPCTSTR)"Der OK-Button-klicker für MSN läuft jetzt im Hintergrund",(LPCTSTR)"^_^", 0,0);
    
    	while (TRUE) {
    
    		HWND w = FindWindow((LPCSTR) "MSBLWindowClass",(LPCSTR)"Windows Live Messenger");//Großvater
    
    //(LPCTSTR)"MSBLWindowClass",(LPCTSTR)"Windows Live Messenger");
    
    		if (w == NULL) {
    			Sleep(100);
    MessageBoxEx(NULL,(LPCTSTR)"SHIT",(LPCTSTR)"", 0,0); 
    			continue; 
    		}
    
    HWND test;
    	HWND child = FindWindowEx(w,test,"MSBLWindowClass",(LPCSTR)"Windows Live Messenger");
    
    //DirectUIHWND
    		// wähle alles erlauben aus
    		HWND cb = FindWindowEx(test, NULL, "DirectUIHWND",(LPCTSTR)"&Anmelden");
    		//FindWindowEx(w,NULL,NULL,(LPCSTR)"&Anmelden");
    		if (cb == NULL) {
    			MessageBoxEx(NULL,(LPCTSTR)"Kann den zulassen Button nicht finden!",(LPCTSTR)"Geht ned :-/", 0, 0);
    			return 1;
    		}
    else
    
    		// auf zulassen klicken
    		SendMessage(cb,WM_LBUTTONDOWN,0,0);
    		SendMessage(cb,WM_LBUTTONUP,0,0);
    
    	}
    
    	return 0;
    }
    

    mfg

    EDIT: Hab da noch ein Problem:

    Im MSDN steht dass ein Child nach dem anderen durchgegangen wird.(bei FindWindowEx)
    Muss ich da ne Schleife und/oder ein array machen und mit denen was machen?
    Oder wird das eh schon durch das 4te Argument gelöst?



  • muhi schrieb:

    Ok, hab jetzt durch Überlegen herausgefunden, dass der Button vermutlich ein Grandchildren ist und ich daher einen Handle vom child brauche den ich mir auch geholt habe.
    Bin aber wegen der Parameter etwas orientierungslos ( 😃 liegt viell daran dass es fast halb vier in der Früh ist)
    [...]
    Im MSDN steht dass ein Child nach dem anderen durchgegangen wird.(bei FindWindowEx)
    Muss ich da ne Schleife und/oder ein array machen und mit denen was machen?
    Oder wird das eh schon durch das 4te Argument gelöst?

    Normalerweise holst du dir erst mit FindWindow das Handle des Haupt-Fensters und hangelst dich dann mit FindWindowEx von Ebene zu Ebene nach unten bis zu deinem gewünschten Child-Fenster durch.
    Dazu muss du dann bei FindWindowEx im 1. Parameter das Fenster-Handle von einer Ebene darüber angeben (also das, in welchem sich das Child befindet), den 2. Parameter setzt du dann erst einmal auf NULL. Wenn es dann auf dieser Ebene mehrere Child-Fenster gibt, die deinen Such-Kriterien (3. und 4. Parameter) entsprechen und du beim ersten Aufruf noch nicht das richtige Handle bekommen hast, dann kannst du FindWindowEx nochmal genauso aufrufen, nur dass du dieses Mal als 2. Parameter dein Handle des vorhergehenden FindWindowEx-Aufrufs angibst. Hast du dann das richtige Handle gefunden geht es in der nächsten Verschachtelungs-Ebene wieder von vorne los (also erstmal mit dem 2. Parameter auf NULL).
    Zusammenfassend: Du musst FindWindowEx in einer Ebene nur in einer Schleife aufrufen, falls du eben nicht gleich beim ersten Mal schon das richtige Fenster gefunden hast.



  • Ok danke genau so hab ich mir das vorgestellt nur hab ich das mit den Parametern ned ganz checkt.

    Hmmm eine Frage noch:muss ich beim 4tzen Parameter "&Anmelden" oder "Anmelden"
    verwenden?

    Lg und danke für die hilfreiche Antwort

    EDIT:

    So laut Testausgaben findet er das Fenster und den Button NUR es tut sich nichts.

    Kann es sein dass das beim Messenger gar nicht mehr geht? (halte ich für unwahrscheinlich)

    hmmm hier mal mein Code

    Zur Info:

    MSBL is der "Großvater"
    DirectUIHWND is das "Kind" des "Großvaters"

    Warnings: cb ist nie eine value nur leider weiss ich nicht wie ich das ändern soll.

    #include <windows.h> 
    
    int WinMain(HINSTANCE hInstance, 
                         HINSTANCE hPrevInstance, 
                         LPSTR     lpCmdLine, 
                         int       nCmdShow) 
    { 
    
        MessageBoxEx(NULL,(LPCTSTR)"Der OK-Button-klicker für MSN läuft jetzt im Hintergrund",(LPCTSTR)"^_^", 0,0); 
    
        while (TRUE) { 
    
            HWND w = FindWindow((LPCSTR) "MSBLWindowClass",(LPCSTR)"Windows Live Messenger");//Großvater 
    
    //(LPCTSTR)"MSBLWindowClass",(LPCTSTR)"Windows Live Messenger"); 
    
            if (w == NULL) { 
                Sleep(100); 
    MessageBoxEx(NULL,(LPCTSTR)"SHIT",(LPCTSTR)"", 0,0); 
                continue; 
            } 
    else MessageBoxEx(NULL,(LPCTSTR)"PASST",(LPCTSTR)"", 0,0); 
    HWND test; 
        HWND father = FindWindowEx(w,NULL, "DirectUIHWND",NULL); 
    
    //DirectUIHWND 
            // wähle alles erlauben aus 
      HWND cb;      
             for (;cb==NULL;){
            HWND cb = FindWindowEx(father, NULL, NULL,(LPCTSTR)"&Anmelden"); 
    }
            //FindWindowEx(w,NULL,NULL,(LPCSTR)"&Anmelden"); 
            if (cb != NULL) { 
                MessageBoxEx(NULL,(LPCTSTR)"Button gefunden",(LPCTSTR)"Geht", 0, 0); 
                return 1; 
            } 
    
            // auf zulassen klicken 
            SendMessage(cb,WM_LBUTTONDOWN,0,0); 
            SendMessage(cb,WM_LBUTTONUP,0,0); 
    
        } 
    
        return 0; 
    }
    


  • Was ist das für ein zusammen gesnippel? Gibt es ja garnet ... der Code ist so rel. sinnlos 😉

    HWND cb;      
             for (;cb==NULL;) {
            HWND /*wtf soll hier HWND ?! */ cb = FindWindowEx(father, NULL, NULL,(LPCTSTR)"&Anmelden");
    }
    

    sollte man geschickterweise mit der while machen: ->

    HWND hWndButton = NULL;
    while (hWndButton == NULL)
        hWndButton = FindWindowEx(hWndMain, NULL, NULL, _T("&Anmelden"));
    

    Und da ist auch wieder ein grundlagenproblem. Du holst bei jedem durchlauf nen neues HWND ... ersetz es durch meinen und es stimmt ...



  • Danke!

    Nur leider funzt das _T ned (error #2140: Type error in argument 4 to a function; found 'int' expected 'const char *'.)

    habs mal durch (LPCSTR)ersetzt.

    Hmmm funzt trotzdem ned. (der Compiler nimmts zwar aber es funzt ned)

    lg

    ps: Viell passt dieser thread ganz gut in die FAQ



  • Die while-Schleife macht eigentlich so gar keinen Sinn - FindWindowEx liefert NULL zurück, wenn er nichts findet (also solltest du FindWindowEx nur solange aufrufen, wie der Rückgabewert != NULL ist). Wobei du wohl gar keine Schleife brauchst (und wenn, macht diese auch nur Sinn, wenn du FindWindowEx nicht jedes Mal wieder von vorne suchen lässt und dazu musst du den 2. Parameter setzen) - oder gibt es mehrere Buttons mit der Beschriftung "Anmelden"?



  • weiss jetzt ned ob die Frage sarkastisch gmeint is gg aba es gibt nur einen Button mit Anmelden.

    EDIT: Naja leider kann ich den 2ten Parameter nicht setzen da ich ihn ja nicht kenne und auch nicht herausfinden kann oder?

    Lg



  • Ich sagte ja schon, wenn es auf einer Ebene nur einen Button gibt, der deinen Suchkriterien gibt, dann musst du FindWindowEx ja eh nur ein Mal (für diese Ebene) aufrufen und folglich bleibt der 2. Parameter eh auf NULL.



  • K thx.

    Hmmm ich hab alles befolgt was ihr mir geraten habt und leider funktioniert es immer noch nicht....

    Hab selbst auch schon genug herumprobiert und es nahe ans Ziel gebracht nur leider klappt es trotzdem ned.

    Hmm hier nochmal der Source den ich gerdade habe:

    #include <windows.h> 
    
    int WinMain(HINSTANCE hInstance, 
                         HINSTANCE hPrevInstance, 
                         LPSTR     lpCmdLine, 
                         int       nCmdShow) 
    { 
    
        MessageBoxEx(NULL,(LPCTSTR)"Der OK-Button-klicker für MSN läuft jetzt im Hintergrund",(LPCTSTR)"^_^", 0,0); 
    
        while (TRUE) { 
    
            HWND w = FindWindow((LPCSTR) "MSBLWindowClass",(LPCSTR)"Windows Live Messenger");//Großvater 
    
    //(LPCTSTR)"MSBLWindowClass",(LPCTSTR)"Windows Live Messenger"); 
    
            if (w == NULL) { 
                Sleep(100); 
    MessageBoxEx(NULL,(LPCTSTR)"SHIT",(LPCTSTR)"", 0,0); 
                continue;
            } 
    else MessageBoxEx(NULL,(LPCTSTR)"PASST",(LPCTSTR)"", 0,0); 
    HWND test; 
        HWND father = FindWindowEx(w,NULL, "DirectUIHWND",NULL); 
    
    //DirectUIHWND 
            // wähle alles erlauben aus 
    HWND hWndButton = NULL; 
    
        hWndButton = FindWindowEx(father, NULL, NULL, ("&Anmelden")); 
            //FindWindowEx(w,NULL,NULL,(LPCSTR)"&Anmelden"); 
            if (hWndButton != NULL) { 
                MessageBoxEx(NULL,(LPCTSTR)"Button gefunden",(LPCTSTR)"Geht", 0, 0); 
                return 1; 
            } 
    
            // auf zulassen klicken 
            SendMessage(hWndButton,WM_LBUTTONDOWN,0,0); 
            SendMessage(hWndButton,WM_LBUTTONUP,0,0); 
    
        } 
    
        return 0; 
    }
    


  • Es wäre sehr nützlich zu wissen, was da jetzt wieder nicht funktioniert. Welche MessageBoxen gibt er aus, oder gar keine oder klickt er einfach den Button nicht?



  • Hi, k sry,

    Alles Messages vor "Button gefunden gibt er aus" sprich "PASST" und "PASST-2".

    er findet den verdammten Button einfach ned alle anderen Handles sind ungleich NULL nur wenn ich dann father für die letzte Funktion als Parameter nehmen und sogar alles andere auf NULL setze findet er nix..

    puh....das is echt nervtötend...

    Lg



  • Ach jetzt weiß ich was die 1. schleife soll ... du willst warten bis die Anwendung gestartet wurde .. kk 😃

    #include <windows.h>
    
    int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
    {
        MessageBox(NULL, TEXT("Der OK-Button-Klicker für MSN-Messanger ist aktiviert!"), TEXT("OK-Button-Klicker"), MB_OK | MB_ICONINFORMATION);
    
        HWND hWndMessanger = NULL;
    
        while (hWndMessanger == NULL)
        { 
            hWndMessanger = FindWindow(TEXT("MSBLWindowClass"), TEXT("Windows Live Messenger"));
    
            if (hWndMessanger == NULL)            
                Sleep(100);
        }
    
        HWND hWndDirectUI = FindWindowEx(hWndMessanger, NULL, TEXT("DirectUIHWND"), NULL);
    
        if (hWndDirectUI == NULL)
            return 0;
    
        HWND hWndButton = FindWindowEx(hWndDirectUI, NULL, NULL, TEXT("Anmelden"));
    
        if (hWndButton == NULL) 
            return 0;
    
        SendMessage(hWndButton, WM_LBUTTONDOWN, 0, 0);
        SendMessage(hWndButton, WM_LBUTTONUP, 0, 0);
    
        return 0;
    }
    


  • ich weiss nicht , läuft das bei dir? Also am Pc (falls du MSN hast mein ich)

    bei mir noch nicht..

    lg



  • hmmm will einfach ned gehen, wäre schade wenn dieser Thread umsonst gewesen wäre hat jmd viell noch ne Idee?

    Thx



  • Beim Aufruf der ersten Funktion Findwindowex scheitert er, bitte helft mir, wenn ich das ned gebacken bekomme kann ich das Programm in den Wind schiessen...


Log in to reply