14. september 2003 - 15:51Der er
10 kommentarer og 1 løsning
Læse hukommelse af et andet program
Først vil jeg gerne sige at jeg er 100% ny på området om at aflæse andre programmers hukommelse. Jeg har lavet en syntax-highlighter til et script-sprog ved navn Jass. Grunden er at det bruges i et computer spil når man laver baner (Warcraft III hvis du skulle være nysgerrig), og i World Editoren til spillet er der blot en lille memo uden syntax-highligt eller auto-indent eller noget som helst.
Jeg har derfor lavet et program til at skrive i. Jeg tænkte at det ville være smart med en knap til at automatisk hente scriptet fra World Editoren ind i mit program så man slipper for at Copy-Paste for meget. Hvis muligt, så også den anden vej.
Problemet er bare at jeg ved intet på det område, så jeg håber at der er nogen der kan give et praj om hvor jeg skal starte.
I lang tid har samarbejdsbranchen fokuseret på at forbedre enhedsfunktioner – bedre kameraer, klarere lyd og smartere software. Men den virkelige forvandling handler ikke om funktioner.
Brug winsight32 eller min yndling Greatis Windows (er skrevet i Delphi) http://www.greatis.com/windowse.htm Det burde være lige ud af landevejen. Bare hold musen over din "World editor" så får du class namet. Det er freeware.
function GetCalcText: string; var Wnd: HWND; ClassName: array[0..144] of char; L: Integer; begin Result := ''; { Find the "calc" window } Wnd := FindWindow(PCHAR('Notepad'), NIL); if Wnd <> 0 then begin { get the first child window... } Wnd := GetWindow(Wnd, GW_CHILD); repeat { ...and search the siblings for the first class named "Static" } GetClassName(Wnd, @ClassName, SizeOf(ClassName)); if StrComp(ClassName, 'Edit') = 0 then begin { get the text length } L := SendMessage(Wnd, WM_GETTEXTLENGTH, 0, 0); if L > 0 then begin { allocate space for the text } SetString(Result, NIL, L); { get the text (into Result) } SendMessage(Wnd, WM_GETTEXT, L, Longint(@Result[1])); { set actual size } SetLength(Result, StrLen(PCHAR(Result))); end; Exit; end; { if StrComp... } Wnd := GetWindow(Wnd, GW_HWNDNEXT); until (Wnd = 0); end; end;
procedure TForm1.Button1Click(Sender: TObject); begin memo1.Text := GetCalcText; end;
Du må selv rette procedure navne/classname til
Stoney
Synes godt om
Slettet bruger
14. september 2003 - 18:49#7
Du kan skrive teksten til notepad sådan:
procedure SetNotepadText(S: String); var Handle:HWND; I:Integer; begin Handle := FindWindowEx(FindWindow( 'notepad', nil ),0,'Edit',nil); SendMessage(Handle, WM_SETTEXT,0,Integer(S)); end;
procedure TForm1.Button1Click(Sender: TObject); begin SetNotepadText(Memo1.Text) end;
Synes godt om
Slettet bruger
15. september 2003 - 13:57#8
Hvis det er trigger editor så kan du bruge det her:
function GetScriptEditorText: String; var Handle:HWND; begin Handle := FindWindowEx(FindWindow( '#32770', 'Trigger Editor'),0,'Edit',nil); SetLength( Result, SendMessage( Handle, WM_GETTEXTLENGTH, 0, 0 )+1); SendMessage( Handle, WM_GETTEXT, Length(Result), integer(Result)); end;
procedure TForm1.Button2Click(Sender: TObject); begin Memo1.Text := GetScriptEditorText; end;
procedure SetScriptEditorText(S: String); var Handle:HWND; begin Handle := FindWindowEx(FindWindow( '#32770', 'Trigger Editor'),0,'Edit',nil); SendMessage(Handle, WM_SETTEXT,0,Integer(S)); end;
procedure TForm1.Button1Click(Sender: TObject); begin SetScriptEditorText(Memo1.Text) end;
Forresten så returnerer din (hejhej) kode teksten fra kommentar boksen. I den anden kode var det lettere at få den til at hente fra edit #2.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.