Text anzeigen - TextOut ?
-
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...
-
supersass1 schrieb:
zu Listing:
aber es muss doch eine Möglichkeit geben...
eine Möglichkeit was zu machen?
-
eine Möglichkeit, es ohne flackern hinzubekommen.
-
supersass1 schrieb:
eine Möglichkeit, es ohne flackern hinzubekommen.
Benutz den code den ich dir gegeben hab!?
-
@Listing: Das ist ja sehr interessant ... dein Code nutzt ja die interne Chat-print-Funktion von Warcraft (er funktioniert auch nur in einem Spiel, also nicht im Menü). Woher hast du ihn? Oder hast du selbst warcraft disassembelt? Bzw wo finde ich weiteren Code, der sich internen Warcraft-Funktionen bedient?
HINWEIS: Um im BNet zu spielen dürfen keine 3rd-party-Tools verwendet werden! Das gilt sowohl für APM-Zähler, als auch Maphacks oder solchen Spielereien.
Ich erinnere nur an die groß angelegten Key-Sperren, die euch auch treffen könnten, wenn ihr so ins BNet geht. Deshalb: verwendet unten stehenden Code nur in LANs oder im Spiel gegen den Computer!@Threadersteller: Ich habe Listings Code so implementiert:
Meine exe-Datei, die die Dll-Datei in eine laufende Wc3-Anwendung injiziert:#include <windows.h> #include <tlhelp32.h> #include <iostream.h> bool InjectDllInProcess(char *pszDllFullPath, DWORD dwProcessId); DWORD GetWc3ProcessId(); bool EnableDebugPrivilege(); int main() { cout << "Sleeping 5 seconds ..." << endl; Sleep(5000); if(!EnableDebugPrivilege()) { cout << "Error enabling debug privilege" << endl; return 0; } DWORD dwId = GetWc3ProcessId(); if(!dwId) { cout << "Process Id not found, closing" << endl; return 0; } cout << "Process Id is " << dwId << ", injecting..." << endl; if(InjectDllInProcess("E:\\injwc3.dll", dwId)) cout << "Injecting successful" << endl; else cout << "Injecting failed" << endl; return 0; } DWORD GetWc3ProcessId() { // search for process war3.exe: HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); PROCESSENTRY32 pe; Process32First(hSnap, &pe); do { if(!lstrcmpi(pe.szExeFile, "war3.exe")) { CloseHandle(hSnap); return pe.th32ProcessID; } } while(Process32Next(hSnap, &pe)); CloseHandle(hSnap); return 0; } bool InjectDllInProcess(char *pszDllFullPath, DWORD dwProcessId) { HANDLE hProcess, hThread; DWORD dwDllStringSize; void *pRemoteString; PTHREAD_START_ROUTINE pfnThreadRoutine; pfnThreadRoutine = (PTHREAD_START_ROUTINE) GetProcAddress(GetModuleHandle("Kernel32"), "LoadLibraryA"); // could the address of LoadLibraryA function be found? if(!pfnThreadRoutine) return false; // open remote process with threadcreation- and writing-flags hProcess = OpenProcess(PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_VM_READ, false, dwProcessId); if(!hProcess) return false; // getsize of DllFullPath: dwDllStringSize = lstrlenA(pszDllFullPath) + 1; // +1 = zero // reserve memory in the remote thread for the name of phtm-dll: pRemoteString = VirtualAllocEx(hProcess, 0, dwDllStringSize, MEM_COMMIT, PAGE_READWRITE); if(!pRemoteString) { // cleanup CloseHandle(hProcess); return false; } // copy dll string into the remote process: if(!WriteProcessMemory(hProcess, pRemoteString, pszDllFullPath, dwDllStringSize, 0)) { // cleanup VirtualFreeEx(hProcess, pRemoteString, dwDllStringSize, MEM_RELEASE); CloseHandle(hProcess); return false; } hThread = CreateRemoteThread(hProcess, 0, 0, pfnThreadRoutine, pRemoteString, 0, 0); if(!hThread) { // cleanup VirtualFreeEx(hProcess, pRemoteString, dwDllStringSize, MEM_RELEASE); CloseHandle(hProcess); return false; } // wait until remote thread ends: WaitForSingleObject(hThread, INFINITE); // cleanup: VirtualFreeEx(hProcess, pRemoteString, dwDllStringSize, MEM_RELEASE); CloseHandle(hThread); CloseHandle(hProcess); return true; } bool EnableDebugPrivilege() { HANDLE hToken; TOKEN_PRIVILEGES tp; LUID luid; if(!LookupPrivilegeValue(0, SE_DEBUG_NAME, &luid)) return false; tp.PrivilegeCount = 1; tp.Privileges[0].Luid = luid; tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) return false; if(!AdjustTokenPrivileges(hToken, false, &tp, sizeof(TOKEN_PRIVILEGES), 0, 0)) return false; CloseHandle(hToken); return true; }
E:\\injwc3.dll musst du damit mit dem Pfad deiner Dll-Datei ersetzen.
Den Code der Dll-datei:
#include <windows.h> #include <process.h> 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 } } void PrintThread(void *p) { int i = 0; while(1) { char szBuf[MAX_PATH]; wsprintf(szBuf, "|cFFFFFF00Nachricht %i|r", i); printToScreen(szBuf); Sleep(2000); i++; } _endthread(); } BOOL WINAPI DllMain(HINSTANCE hinst, DWORD fdwReason, LPVOID lpReserved) { switch (fdwReason) { case DLL_PROCESS_ATTACH: Sleep(2000); _beginthread(PrintThread, 0, 0); break; } return true; }
Wenn hier auch jmd TFT zoggt - schaut mal chan clan liz vorbei :).
MfG
-
Black Shadow schrieb:
@Listing: Das ist ja sehr interessant ... dein Code nutzt ja die interne Chat-print-Funktion von Warcraft (er funktioniert auch nur in einem Spiel, also nicht im Menü). Woher hast du ihn?
Dazu sollte man Ahnung von Debuggern haben und ein bisschen asm können,
ich hab den Code selber herrausgefunden auch wenn er einfach von WC3 gerippt ist
ist (siehe char * dumpFF = "xFFxFFxFFxFF" ).
Man muss nur dafür sorgen, dass alle register beim Call gleich sind, und rausfinden was die Argumente sind (bei dieser Funktion nicht viele)Bzw wo finde ich weiteren Code, der sich internen Warcraft-Funktionen bedient?
In Warcraft?
Es gibt leider nicht sehr viel "public" code, der diese Funktionen nutzt, aber du kannst dich ja mal auf einigen Maphack Seiten umsehen, vielleicht findest du ja etwas (cryticalerror.net z.B.)
-
Black Shadow schrieb:
BOOL WINAPI DllMain(HINSTANCE hinst, DWORD fdwReason, LPVOID lpReserved) { switch (fdwReason) { case DLL_PROCESS_ATTACH: Sleep(2000); _beginthread(PrintThread, 0, 0); break; } return true; }
Threads dürfen nicht im Kontext der DllMain gestartet werden:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-177681.html
(Hoffe ich weiß auch bald wieso.)