Text anzeigen - TextOut ?



  • 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



  • biiiitte lieber Listing, gibts du mir den printbefehl. 🙂

    Und wie meinst du das mit der dll selber basteln? Was soll denn dadrin stehen?



  • supersass1 schrieb:

    biiiitte lieber Listing, gibts du mir den printbefehl. 🙂

    Und wie meinst du das mit der dll selber basteln? Was soll denn dadrin stehen?

    char * dumpFF = "xFFxFFxFFxFF";
    void __declspec(naked) printToScreen(char * myMessage) //by Listing(c)
    {
       __asm{
    
       printmessage:                           //<= Procedure Start
            push ebp
            mov ebp,esp
            push -1
            mov eax,dword ptr ds:[0x6f84cc20]
            test eax,eax
            je notingame                      //Kleiner Test ob man im Game ist
            cmp dword ptr ds:[eax+0x1ac],0    //weil sonst Abstürze möglich sind
            je notingame
            mov eax,dword ptr ds:[eax+0x3e0]
            mov edx,dword ptr ds:[eax]
            push 0
            push 0x41200000
            push dumpFF
            push [myMessage]   
            mov ecx,eax
            call dword ptr ds:[edx+0x6c]
          notingame:
          leave
          retn
       }
    
    }
    

    DLL "Testcode"

    // WC3-Print.cpp : Definiert den Einstiegspunkt für die DLL-Anwendung.
    //
    #include <windows.h>
    #include <winuser.h>
    // Definition globaler Variablen 
    void printToScreen(char * myMessage);
    
    BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpReserved )  
    {
    
        switch (fdwReason)
        {
        case DLL_PROCESS_ATTACH:
        {
            Sleep(2000); //Zeit um zu WC3 zu switchen
            printToScreen("|cFFFFFF00Greetings by Listing to superass1|r"); //Farbcode
            break;
        }
    
        case DLL_THREAD_ATTACH:
          break;
    
        case DLL_THREAD_DETACH:
          break;
    
        case DLL_PROCESS_DETACH:
            break;
    
      }
    
      return TRUE;
    }
    

    Du musst eine DLL-Anwendung erstellen

    PS:
    Um die dll in WC3 zu jagen:
    http://www.mpcdownloads.com/forums/downloads.php?do=file&id=5418



  • hmm.. nur leider habe ich die Option DLL-Anwedung leider nicht,
    ich benutze CodeBLocks. Im Microsoft Visual C++ 6.0 gibts auch nicht so eine, oder ähnliche Funktion. Und mein Borland funktioniert grad nicht, da ich den Editor nicht finde.

    Der erste Code soll der Code einer Headerdatei sein, sehe ich das richtig?!


Anmelden zum Antworten