hwnd eines Dialogs



  • Hallo

    Wie könnte ich an ein Fensterhandle von einer Dialogbox die mit SHBrowseForFolderW() erzeugt wurde?

    hwnd = FindWindow(NULL ,"Ordner suchen");

    Ist das die einzige Methode?

    PS: Schreibe mit C und der Win32Api



  • Könntest beispielsweise auch mit GetWindow() über die Z-Ordnung probieren... Bin mir jetzt nicht sicher, aber es kann sein, dass man so etwas auch mit EnumChildWindows() hinbekommen könnte. FindWindow() funktioniert ja nicht mit ChildWindows, deswegen solltest du lieber mit FindWindowEx() probieren.

    Grüße,
    Rewind.



  • Ich möchte eigentlich im Firefox das edit address Feld auslesen. Eben dass zbsp. http://www.c-plusplus.net/forum/reply287537
    und ausgeben.



  • Ich glaube das war der falsche Link 🙂



  • der link ist egal! ich möchte etwa in der form was zurückbekommen. kann ich den das address edit-feld nicht auslesen?



  • code-nase schrieb:

    der link ist egal!

    Warum postest du's dann?

    code-nase schrieb:

    kann ich den das address edit-feld nicht auslesen?

    Ja, das kannst du in der Tat, und zwar mit Edit_GetText()



  • Bei deinem Vorhaben gibt es zwei ernsthafte Probleme: Erstens müsste das Editfeld gefunden werden und zweitens müsste es auch noch dazu gebracht werden, seinen Text preiszugeben.
    Für das erste Problem gibt es eine einfache Lösung: GetFocus() in Verbindung mit AttachThreadInput funktioniert mit normalen Fenstern und Dialogen. Bei "eingebetteten" Objekten wie dem Nachrichtentextfeld im Firefox scheitert diese Methode jedoch.
    Und selbst wenn man ein gültiges Handle auf ein Control erhalten hat, muss dieses Control auch noch auf WM_GETTEXT(LENGTH) reagieren. Die Standardcontrols machen dies natürlich, der Firefox nutzt jedoch Eigene, die diese Nachrichten nicht unterstützen.
    Du müsstest dich also mal genauer mit dem Quelltext des Browsers auseinandersetzen.
    Aber wie schon geschrieben, das Auslesen von Standard-(Edit-)Controls mit C++ ist einfach:

    #include <vector>
    #include <windows.h>
    #include <conio.h>
    int main()
    {
    	while(!_kbhit())
    	{
    		HWND fgWnd = GetForegroundWindow();
    		DWORD mythreadid = GetCurrentThreadId();
    		if(fgWnd)
    		{
    			DWORD wndthreadid = GetWindowThreadProcessId(fgWnd,NULL);
    			if(AttachThreadInput(mythreadid, wndthreadid, true))
    			{
    				HWND focus = GetFocus();
    				size_t len = SendMessage(focus, WM_GETTEXTLENGTH, 0, 0);
    				if(len)
    				{
    					std::vector<char> v(len+1);
    					SendMessage(focus, WM_GETTEXT, v.size(), reinterpret_cast<LPARAM>(&v[0]));
    					std::cout << &v[0] << std::endl;
    				}
    				AttachThreadInput(mythreadid, wndthreadid, false);
    			}
    		}
    		Sleep(1000);
    	}
    }
    


  • Danke erstmal

    Habe es aber inzwischen so lösen wollen 🙄 aber da kommt nichts return. Bzw. Der String wird nicht zurückgegeben! Immer ""
    Mit Spy++ habe ich alles zurückverfolgt und es geht auch, nur bekomme ich eben nichts zurück. In Spy++ sehe ich aber den Link. Weis echt nicht mehr weiter...

    #include <windows.h>
    #include <windowsx.h>
    #include <stdio.h>
    #include <wchar.h>
    
    int main()
    {
    
    	HWND hwnd_h ,hwnd_h1 ,hwnd_h2 ,hwnd_h3 ,hwnd_hm ,hwnext = NULL;
    	wchar_t textbuf[102];
    
    	for(;;) {
    
    		Sleep(30);
    
    		hwnd_hm = FindWindow(L"IEFrame" ,NULL);
    		if(hwnd_hm != NULL) {
    			hwnd_h = FindWindowEx(hwnd_hm ,NULL ,L"WorkerW" ,NULL);
    			if(hwnd_h != NULL) {
    				hwnd_h1 = FindWindowEx(hwnd_h ,NULL ,L"ReBarWindow32" ,NULL);
    				if(hwnd_h1 != NULL) {
    					hwnd_h2 = FindWindowEx(hwnd_h1 ,NULL ,L"Address Band Root" ,NULL);
    					if(hwnd_h2 != NULL) {
    						hwnd_h3 = FindWindowExW(hwnd_h2 ,hwnext ,L"Edit" ,NULL);
    						if(hwnd_h3 != NULL) {
    							Edit_GetText(hwnext ,textbuf ,100);
    							wprintf(L"%s",textbuf);
    						}
    					}
    				}
    			}
    		}
    
    	}
    
    	return 0;
    }
    


  • Hmm, nochmal: mit Firefox geht das so nicht, da eigene Controls, keine Hwnds. Der Code, den Du zeigst, sucht im Internet Explorer.



  • Ja das dieser Code nur auf den IE zugeschnitten ist, ist mir auch klar. 🙄


Anmelden zum Antworten