Konsolen Anwendung unter Winxp - FindWindow geht nicht



  • Betrifft das Tutorial "Spieletrainer", siehe h**p://www.codecreator.net/cpp/tutmem.txt.

    Ich habe die Quelltexte 1:1 übernommen und als Konsolen Anwendung kompiliert (BCB6 -> Konsolen-Experte).
    Klappt alles soweit, nur leider findet FindWindow() das Handle der Opfer Anwendung nicht.
    Auch mit Programmen wie Winspector Spy komme ich nicht weiter.
    Liegt das nur an WinXP oder was mache ich falsch?!



  • Was für Parameter hast du denn an FindWindow übergeben 🙄



  • Hello.cpp - Win32 Konsolen Beispielprogramm ("Hello World")

    #include <iostream.h>
    #include <windows.h>
    
    #pragma hdrstop
    #pragma argsused
    
    int main(int argc, char* argv[])
    {
    	cout << "Hallo\n"i << endl;
             cin.ignore(); // warte auf Tastendruck, erst dann beenden
    	return 0;
    }
    

    SucheApp.cpp - Soll Window Handle von Hello.exe finden

    #include <windows.h>
    #include <iostream.h>
    
    #pragma hdrstop
    #pragma argsused
    
    using namespace std;
    
    int main(int argc, char* argv[])
    {
    	HWND hWnd;
    	hWnd = FindWindow(NULL,"Hello"); //  <--- 
    	if (!hWnd)
             {
                    cout << "Hello NOT found" << endl;
             }
             else
             {
                    cout << "Hello found" << endl;
    
                    // mache dies und das
    
             }
    
            cin.ignore();
            return 0;
    }
    

    Wenn ich jetzt Hello.exe starte und dann SucheApp.exe aufrufe so findet
    es das hWnd von Hello.exe nicht, d.h.

    if (!hWnd)   == TRUE, egal wie ich es anfasse :(
    

    Hinweis: Benutze BCB 6 Prof, WinXP(!)
    Habe ein neues Projekt mit Konsolenexperten erstellt und die Sources von o.g.
    Quelle 1:1 eingefügt. Eigentlich sollte es ja klappen, aber Gayshit halt 😉



  • Das cin.ignore() nicht auf einen Tastendruck wartet, weißt du aber schon, oder?

    MfG SideWinder



  • Das Fenster hat eben nicht den Namen "Hallo" 🙄



  • SideWinder schrieb:

    Das cin.ignore() nicht auf einen Tastendruck wartet, weißt du aber schon, oder?

    MfG SideWinder

    egal...

    flenders schrieb:

    Das Fenster hat eben nicht den Namen "Hallo" 🙄

    Ahh ja... jetzt weiss ich Bescheid...
    Tolle Hilfe 👎



  • Pansemuckl schrieb:

    SideWinder schrieb:

    Das cin.ignore() nicht auf einen Tastendruck wartet, weißt du aber schon, oder?

    MfG SideWinder

    egal...

    flenders schrieb:

    Das Fenster hat eben nicht den Namen "Hallo" 🙄

    Ahh ja... jetzt weiss ich Bescheid...
    Tolle Hilfe 👎

    1. Nicht egal - wenn sich das Fenster sofort wieder schließt kannst du es nicht finden.

    2. Wie willst du ein Fenster finden wenn du nach einem Titel suchst der nicht vorhanden ist. In deinem Konsolenprogramm würde ich folgendes machen:

    SetConsoleTitle("Hello World");

    Dann kannst du bei dir mit

    hwnd=FindWindow(NULL,"Hello World");

    Dein Fenster finden!

    MfG SideWinder



  • Nicht das was du in das Konsolenfenster hinein schreibst ist der Name des Fensters, sondern das was in der Titelleiste steht 😉



  • FindWindow sucht entweder nach einem KlassenNamen (1. Parameter) oder dem Fenstertitel (2. Parameter).

    Da Du in deinem Fall nur einen 2. Parameter angibst, suchst Du nach einem Fenster, welches "Hello" im Fenstertitel stehen hat.

    Das wird aber bei Deiner Konsolenanwendung nicht der Fall sein. Der Fenstertitel der Konsole, in der Dein Programm läuft hat eher den Titel

    D:\Eigene Dateien\C-Projekte\Hello\Hello.exe

    oder so ähnlich!

    Deshalb findest Du das Fenster nicht mit FindWindow.

    Wenn Du den EXE-Namen finden willst mußt Du EnumWindows() aufrufen und in der EnumWindowsProc den EXE-Namen des entsprechenden Programmes (welches zu dem Fensterhandle gehört, welchen EnumWindows Dir lieferte) holen und mit dem EXE-Namen vergleichen, dessen Fenster Du suchst....

    Mit FindWindow wirst Du da nicht weit kommen...



  • Hepi schrieb:

    FindWindow sucht entweder nach einem KlassenNamen (1. Parameter) oder dem Fenstertitel (2. Parameter).

    Da Du in deinem Fall nur einen 2. Parameter angibst, suchst Du nach einem Fenster, welches "Hello" im Fenstertitel stehen hat.

    Das wird aber bei Deiner Konsolenanwendung nicht der Fall sein. Der Fenstertitel der Konsole, in der Dein Programm läuft hat eher den Titel

    D:\Eigene Dateien\C-Projekte\Hello\Hello.exe

    oder so ähnlich!

    Deshalb findest Du das Fenster nicht mit FindWindow.

    Wenn Du den EXE-Namen finden willst mußt Du EnumWindows() aufrufen und in der EnumWindowsProc den EXE-Namen des entsprechenden Programmes (welches zu dem Fensterhandle gehört, welchen EnumWindows Dir lieferte) holen und mit dem EXE-Namen vergleichen, dessen Fenster Du suchst....

    Mit FindWindow wirst Du da nicht weit kommen...

    Wo sind da die neuen Informationen? Und wieso kommt er mit meiner Methode nicht weit?

    MfG SideWinder



  • Weil ich das geschrieben habe während Du gepostet hast!

    Außerdem scheint es, das er nach einer "Hello.exe" sucht (zumindest schreibt er das).

    Er schreibt in seinem Pogramm "Hallo" auf die Konsole, sucht aber nach "Hello".

    Nicht gesehen?

    Außerdem geht es (im entferntesten Sinne) um einen SPieletrainer, ich bezweifle jetzt mal das er den Quellcode für dieses Spiel besitzt um dort SetConsoleTitle() einzubauen!



  • Hepi schrieb:

    Der Fenstertitel der Konsole, in der Dein Programm läuft hat eher den Titel
    D:\Eigene Dateien\C-Projekte\Hello\Hello.exe
    oder so ähnlich!
    Deshalb findest Du das Fenster nicht mit FindWindow.

    Sehr richtig! Hatte es auch mit dem Programmpfad (der ja Titel des Konsolenfensters ist) versucht,
    geht aber nicht. Auch mit GetConsoleTitle() war ich nicht weiter gekommen, weil ich u. U. mehrere Konsolen offen habe.

    SetConsoleTitle("Hello World"); ist die Lösung!!

    Damit klappt es.

    Weiss evtl. jemand, warum Konsolenanwendungen in Spy Programmen wie dem WinSpector o. Winsight nicht auftauchen? Laufen Konsolen-Appz evtl als Exlorer Threads?

    Ich versuche mich jetzt noch an der 2. Lösung wie von Hepi vorgeschlagen.
    Damit sollte eine Funktion *HWND FindWindowOfApp(char ExeFileName)
    machbar sein.

    🙂



  • Bei der letzen Version ist aber zu beachten, dass Anwendungen häufig mehrere Fenster haben



  • flenders schrieb:

    Bei der letzen Version ist aber zu beachten, dass Anwendungen häufig mehrere Fenster haben

    Eine Konsolenanwendung meistens nicht - keine Ahnung warum ;).

    MfG SideWinder



  • ... aber sie kann mehrfach gestartet sein

    *nachausredesuch* 😃


Anmelden zum Antworten