Name der Anwendung die sich gerade unter der Mouse befindet.



  • Hallo,

    Ich habe da ein mich in den Wahnsinn treibendes Problem.
    Moechte das in meinem Formular der Name der Anwendung gezeigt wird, ueber der sich gerade die Mouse befindet.

    //Hiemit ermittle ich die globalen Koordinaten der Mouse:

    TPoint Punkt1 =Mouse->CursorPos;

    :(( das bringt aber keine Verbesserung in richtung Problemloesung

    //Deshalb wahrscheinlich besser:
    HWND H1= Mouse->Capture;

    Dann hab ich das Handle des Fensters oder????

    Aber wie komm ich jetzt vom "HWND H1" dahin, dass ich einem AnsiString den entsprechenden Namen der Anwendung zuweisen kann???

    ...oder gibt es eine Funktion die aufgrund der Mouskoordinaten den Fensternamen in einen String laden kann?



  • Da mußt du schon die Win-API bemühen. Stichworte: FindWindow(Ex), EnumWindows...



  • Hallo Zusammen

    Dies geht mit folgendem Stück Code.

    POINT *CurserPos=new POINT;
    HWND handle;
    
    GetCursorPos(CurserPos);
    handle=WindowFromPoint(*CurserPos);
    
    delete CurserPos;
    

    Noch einen schönen Abend.



  • Danke fuer deine Hilfe.
    Alles was ich ueber C++ und Computer im allgemeinen weis habe ich mir selbst beigebracht also in Buechern und aehnlichem recherchiert, aufgrund dessen bestehen natuerlich massive Wissensluecken. Eventuell kannst du noch eine Funktion benennen die der structur HWND (oder klasse) weis net genau, den namen des entsprechenden formulars so entlocken kann, das ich ihn in ein char array einen ansistring oder einen nullterminierten string aus guten alten c-Tagen laden kann. Trotzdem schon mal ein dickes Danke fuer deine Antwort!!!



  • Hallo,

    HWND ist nur eine Zahl. Da kann man nichts direkt rauslesen. Für weitere Informationen benötigst du weitere WinAPI-Funktionen. Hier z.Bsp.
    GetWindowText
    Weitere Fragen zu diesem Thema solltest du vielleicht besser im WinAPI-Forum stellen.

    POINT CurserPos;
    GetCursorPos(&CurserPos);
    HWND handle=WindowFromPoint(CurserPos);
    char buffer[200];
    int res = GetWindowText(handle, buffer, 199);
    if( res ) // Text gefunden
    {
    }
    

    nicht getestet.



  • Hallo

    Also ich hatte vor ein paar Monaten mal eine kleine Anwendung geschrieben, welche ein paar Fensterinformationen ausliest.

    Hier ein kleiner Ausschnitt.
    Wenn du willst, kannst du auch das Komplette Beispiel haben.
    (Wäre ein bisschen gross, hier alles einzuspeisen)

    Der Timer list ständig die Position der Maus aus und holt entsprechende Informationen.

    void __fastcall TF_Hauptformular::T_SearchInfosTimer(TObject *Sender)
    {
    	//Definition der benötigten Variabeln
    	HWND hwFensterHandle;
    	POINT *Mausposition=new POINT;
    
    	//Auslesen der Mausposition und des Handles des markierten Bereiches
    	GetCursorPos(Mausposition);
    	hwFensterHandle=WindowFromPoint(*Mausposition);
    
    	//Gibt die Werte wie den Klassennamen, Fenstername, und den Inhalt (Text) aus
    	vf_GetStandartInfos(hwFensterHandle);
    
    	//Lesen der SysListView32 Elemente (Desktop,...)
    	LB_SysListItems->Clear();
    	vf_GetSysListItems(hwFensterHandle);
    
    	//Lesen der Button-Elemente (Taskbar, Infobar)
    	LB_ButtonItems->Clear();
    	vf_GetButtonItems(hwFensterHandle);
    
    	//Lesen der ListBox-Elemente
    	LB_ListBoxItems->Clear();
    	vf_GetListBoxItems(hwFensterHandle);
    
    	//Auslesen der Tree Elemente
    	LB_TreeItems->Clear();
    	vf_GetTreeItems(hwFensterHandle);
    
    	delete Mausposition;
    }
    
    //---------------------------------------------------------------------------
    void __fastcall TF_Hauptformular::vf_GetStandartInfos(HWND hwFensterHandle)
    {
    	char cFensterinfos[1024]={'\0'};
    	int iMaxInfoLength=1024;
    
    	//Schreiben des Fensterhandles
    	TXT_WindowHandle->Text=(AnsiString)(long)hwFensterHandle;
    
    	//Lesen der Fensterklasse
    	GetClassName(hwFensterHandle,cFensterinfos,iMaxInfoLength);
    	TXT_WindowClassName->Text=cFensterinfos;
    
    	//Lesen des Fenster-Titels
    	GetWindowText(hwFensterHandle,cFensterinfos,iMaxInfoLength);
    	TXT_WindowTitel->Text=cFensterinfos;
    
    	//Lesen des Textes
    	SendMessage(hwFensterHandle,WM_GETTEXT,(WPARAM)iMaxInfoLength,(LPARAM)cFensterinfos);
    	TXT_WindowText->Text=cFensterinfos;
    }
    

    Naja ist eigentlich nichts spezielles, als Beispiel sollte es aber dennoch reichen.



  • zwei Fragen. 🙂
    Warum erzeugst du deine POINT-Variable dynamisch?
    Was sollen diese AnsiString-casts bei den Zuweisungen zu den Edits?



  • Hallo Braunstein.

    Da muss ich dir Recht geben.
    1. Ich habe die Variabel damals dynamisch erzeugt, da Sie in dieser Form von der Funktion "GetCurserPos" verlangt wird.

    2. Da habe ich mir wohl etwas unnötiges angeeignet. Ich dachte, das es dies braucht, damit der Wert richtig umgewandelt werden kann.

    ➡ Mann Lernt halt immer noch dazu 😃

    Danke für deine Hinweise. 💡



  • Hallo

    Deforation schrieb:

    1. Ich habe die Variabel damals dynamisch erzeugt, da Sie in dieser Form von der Funktion "GetCurserPos" verlangt wird.

    Nein die Funktion verlangt nur einen Pointer auf eine Instanz, nicht aber das diese Instanz auf dem Heap liegt.

    Deshalb ist das von Braunstein schon gezeigte Vorgehen vorzuziehen

    POINT CurserPos;
    GetCursorPos(&CurserPos);
    

    bis bald
    akari



  • Deforation schrieb:

    2. Da habe ich mir wohl etwas unnötiges angeeignet. Ich dachte, das es dies braucht, damit der Wert richtig umgewandelt werden kann.

    AnsiString besitzt Konstruktoren für alle möglichen Zahlentypen. Also wird die Umwandlung sowieso automatisch erledigt, wenn sie möglich ist. Wenn keine Umwandlung möglich ist würde es eine Fehlermeldung geben. Mit deinem C-cast würdest du das aber effektiv verhindern.



  • Vielen Dank fuer eure Antworten und Code-Beispiele und Sorry das erst jetzt eine Reaktion von mir erfolgt, ich hatte ein paar sehr wichtige andere Dinge zu bewaeltigen, so dass ich mir keine Zeit fuer das C++ Forum genommen habe.

    Eure Antworten haben mir sehr sehr doll weitergeholfen! Vor allen Dingen haben sie mich auf die richtige Faehrte gefuehrt (WinApi Funktionen und so weiter).

    Leider habe ich aufgrund eines fatalen Fehlers grosse Teile meiner Festplatte zerschossen,so das ich Windows komplett neu aufspielen musste. Ich habe keine Borland CD mehr zur Verfuegung, konnte zwar den Builder durch herunterladen diverser Dll`s aus dem Internet wieder lauffaehig machen, vermisse jetzt aber alle Komponenten, also ich hab momentan keine TButton,TImage,TEdit... und wie sie alle heisen mehr zur Verfuegung. Sobald ich rausgekriegt habe wie ich diese wiederbeschafen kann werde ich die angegebenden Code`s ausprobieren.

    Ich kann jedoch jetzt schon sagen das eure Antworten mehr als hilfreich waren.


Anmelden zum Antworten