Text anzeigen - TextOut ?



  • also,

    ich möchte ein Programm programmieren, das mittels eines klines Texte oben rechts (oderl inks) im Spiel (Warcraft 3) anzeigt, was ich bauen soll. Also ein Art Tutorial-Programm.

    Dazu müsst ich noch wissen, wie das geht mit dem Text anzeigen.

    ich habe folgendes probiert:

    PAINTSTRUCT ps;
    HDC hDC;
    
    const char szText[] = "tralalalala";
    hDC = BeginPaint(hWnd, &ps) //hWnd = Fenster von Warcraft3
    {
    TextOut (hDC, 50, 50, szText, sizeof(szText) - 1);
    }
    EndPaint(hWnd, &ps);
    

    Es kommt weder eine Fehlermeldung, noch wird der Text angezeigt, was mache ich falsch?
    Liegt es daran dass es ein Game ist und der das vielleicht sekündlich aktualiesiert oder so?

    mit freundlichen Grüßen
    supersass1



  • Es dürfte vor allem daran liegen, daß das Fenster dir nicht gehört - Windows ist da etwas eigen von wegen Zugriffen zwischen verschiedenen Programmen.



  • jaa gut, es gibt aber Programme, die können da Texte anzeigen.

    So auch ein Programm für Warcraft.

    Doch wie mache ich das?



  • Wenn du online spielen willst,dann solltest du das Projekt ganz lassen.

    Wenn du nicht online spielen willst,dann ignoriere meinen Post.



  • es geht mir ja nicht daram, zu spielen. Es geht mir darum, einfach so etwas zu machen.

    p.s. ich spiele online und weiß somit was du meinst.



  • supersass1 schrieb:

    Liegt es daran dass es ein Game ist und der das vielleicht sekündlich aktualiesiert oder so?

    Jo, daran kann es liegen.
    Aber probiere mal die Funktion GetWindowDC. Fall das auch nicht richtig funktioniert, kannst Du mal testweise die Funktion LockWindowUpdate mit ins Spiel bringen (Achtung: Vorher MSDN lesen 😃 ).



  • mein Code

    int meinwindow()
    {
    
    HANDLE hproc;
    DWORD procid;
    DWORD rw = 0;
    
    unsigned adress = 0x001504BC;  //0x11A9FBE7;
    char buffer[512];
    
    hWnd2 = FindWindow(0,"Warcraft III");
    
    ShowWindow(hWnd2, SW_MAXIMIZE);
    Sleep(5000);
    //GetWindowDC(hWnd2);
    LockWindowUpdate(hWnd2);
    Sleep(100);
    
    PAINTSTRUCT ps;
    HDC hDC;
    const char  szText[] = "Hallo, dies ist der Text.";
    hDC = BeginPaint(hWnd2, &ps);
    {
    TextOut(hDC, 50, 50, szText, sizeof(szText) - 1);
    }
    EndPaint(hWnd2, &ps);
    return 0;
    
    }
    

    leider klappt es nicht. es kommt auch keine Fehlermeldung, die Funktion meinwindow() ist halt selbstdefiniert im Win-Api Programm.

    Wäre es nicht am einfachsten, so einen Text ganz nach oben zu legen, d.h. über alle Fenster?



  • Warcraft 3 ist doch bestimmt mit einer ED engine programmiert, die entweder OpenGL oder (wahrscheinlicher) DirectX benutzt.

    Funktioniert

    TextOut(hDC, 50, 50, szText, sizeof(szText) - 1);
    

    überhaupt in nem DirectX Programm?



  • Ich meine natürlich 3D und nicht ED 🙂



  • TextOut () alleine reicht (ohne Begin-/EndPaint) :

    ...
    hWnd2 = FindWindow(0,"Warcraft III");
    ...
    // in Schleife :
    ...
     hDC = 
     GetWindowDC (hWnd2);
     TextOut     (hDC, 50, 50, szText, sizeof(szText) - 1);
     ReleaseDC   (hWnd2,hDC);
    ...
    

    (sollte aber in einer Schleife sein weil sich das WARCRAFT-Fenster ständig aktualisiert)



  • ich habe auch deine Möglichkeit probiert, klappt leider nicht.

    Wenn ich es allerdings so mache, wird der Text nach 5 Sekunden ganz kurz angezeigt, quasi ein aufblinken, was nicht wiederkehrt.

    unsigned adress = 0x001504BC;  //0x11A9FBE7;
    char buffer[512];
    
    hWnd2 = FindWindow(0,"Warcraft III");
    
    ShowWindow(hWnd2, SW_MAXIMIZE);
    //const char  szText[] = "Hallo, dies ist der Text.";
    
    Sleep(5000);
    
    PAINTSTRUCT ps;
    HDC hDC;
    const char  szText[] = "Hallo, dies ist der Text.";
    while(1)
    {
    hDC = BeginPaint(hWnd2, &ps);
    {
    TextOut(hDC, 50, 50, szText, sizeof(szText) - 1);
    }
    EndPaint(hWnd2, &ps);
    
    }
    


  • Ich würde ein Window drübermalen ohne Rand und ohne WS_CHILD



  • bitte erläuter was du meinst, vielleicht ein CodeSchnipsel?! 🙂



  • supersass1 schrieb:

    ich habe auch deine Möglichkeit probiert, klappt leider nicht.
    Wenn ich es allerdings so mache, wird der Text nach 5 Sekunden ganz kurz angezeigt, quasi ein aufblinken, was nicht wiederkehrt.

    Das WARCRAFT-Fenster aktualisiert sich ständig. Wenn Du TextOut () nur einmal aufrufst, dann wird es auch nur einmal angezeigt.



  • so wie du oben siehst befindet sich TextOut() in einer Schleife...

    while(1)
    {...



  • Oh, hab ich nicht gesehen. Dann probier mal folgendes :

    ...
    hWnd2 = FindWindow(0,"Warcraft III");
    ...
    while ( 1 ) 
    {
     hDC = 
     GetWindowDC (hWnd2);
     TextOut     (hDC, 50, 50, szText, sizeof(szText) - 1);
     ReleaseDC   (hWnd2,hDC);
     Sleep       (50); // zw. 10 und 100, sonst flackert es
    }
    

    Begin/EndPaint () zumindest ist nicht geeignet dafür :

    MSDN schrieb:

    (blubber) ... An application should not call BeginPaint except in response to a WM_PAINT message ... (blabla)

    Was u.a. heisst, dass Du für Begin/EndPaint () die "case WM_PAINT :" der "WinProc" brauchst. Und die ist nicht vorhanden.



  • ah okay vielen Dank, funktioniert.

    Nun leider doch 2 Probleme

    1. es flackert, egal ob bei Sleep() 1,5,10,20,50 oder 100
    2. Gibts einen Befehl zur Fomatierung, sprich HIntergrund, Textfarbe und Größe?
    SetTextColor und der Rest?



  • Wenn du mit ner dll im Prozess bist,
    kannst du die ingame Messageprintfunktion benutzen
    um Text anzuzeigen



  • dann erklär mir mal bitte:

    1. welche dll ich benutzen könnte
    2. wie ich die printfunktion herausbekomme?

    mit freundlichen grüßen 🙂



  • supersass1 schrieb:

    dann erklär mir mal bitte:

    1. welche dll ich benutzen könnte
    2. wie ich die printfunktion herausbekomme?

    mit freundlichen grüßen 🙂

    Code einfach selbst eine dll und injiziere sie in Warcraft III...

    2.freundlich Fragen dann kann ich sie dir geben


Anmelden zum Antworten