Text anzeigen - TextOut ?



  • 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?!



  • Frag ihn mal lieber warum er das so kompliziert und "flexibel" macht.
    Noch Interesse an TextOut () ?



  • mich interessiert beides.

    Mein TextOut() funktioniert ja soweit. Die Formatierungsbefehle finde ich auch schon irgendwie selber inner MSDN.
    Interessant wäre nur zu wissen, warum es dennoch flackert.

    Kann man nicht ein kleines Feld oben links für sich selber, sprich nach ganz nach oben legen, und da nen Text reinschreiben. Ich meine bei einem Bildschirmschoner ist es doch nihts anderes oder?

    mit freundlichen Grüßen



  • Probier mal :
    1. Sleep () mit bis zu 500,
    2. die Koordinaten von TextOut () an eine Stelle im Fenster zu legen, wo nicht soviel "herumgepinselt" wird.
    Vielleicht lässt sich ja ein "eigenes Feld" vermeiden.



  • supersass1 schrieb:

    mich interessiert beides.

    Mein TextOut() funktioniert ja soweit. Die Formatierungsbefehle finde ich auch schon irgendwie selber inner MSDN.
    Interessant wäre nur zu wissen, warum es dennoch flackert.

    Kann man nicht ein kleines Feld oben links für sich selber, sprich nach ganz nach oben legen, und da nen Text reinschreiben. Ich meine bei einem Bildschirmschoner ist es doch nihts anderes oder?

    mit freundlichen Grüßen

    Weil Warcraft das immer wieder überschreibt, ernst genommen musst du einen jump von der Drawfunktion von Warcraft zu deiner Drawfunktion legen



  • zu Merker:

    je höher die Zahl wird, desto weniger kann man erkennen, und mit dem verlegen bringt auch nicht viel.

    zu Listing:

    aber es muss doch eine Möglichkeit geben...


Anmelden zum Antworten