![]() |
2 fragen zu HWND und HWND+Canvas
hallo leute,
Ich hab hier mal nach etwas gesucht das mit dem ich durch Canvas die farbe checken kann. Dann hat mir jemand das hier gegeben: ![]() Ich hab das dann auch benützt und geht alles super, doch ich will nicht das er es von dem gesammten desktop/bildschirm nimmt sondern nur von einem bestimmten fenster. Also das ist was ich gerade benütze:
Delphi-Quellcode:
So nun hab ich versucht das fenster (in diesem fall MapleStory) zu nehmen, also
procedure TForm1.Timer1Timer(Sender: TObject);
var DCanvas: TCanvas; DHandle: HWND; currentcaption, currentminus2: Integer; begin DHandle:=GetDC(0); if DHandle<>0 then begin try DCanvas:=TCanvas.Create; try DCanvas.Handle:=DHandle; if DCanvas.Pixels[293, 335] = RGB(239, 239, 239 ) then begin Timer1.Enabled := false; Timer2.Enabled := false; Label4.Caption := inicurrent; Label4.Visible := true; Label5.Visible := true; if Checkbox1.Checked = true then PlaySound(PChar('logged.wav'),0,SND_ASYNC or SND_LOOP); ShowMessage (inicurrent); PlaySound(nil,0,0); end finally DCanvas.Free; end; finally if ReleaseDc(0, DHandle)<>1 then RaiseLastOSError; end; end else RaiseLastOSError; end;
Delphi-Quellcode:
Und hab dann versucht es so dann nur von diesem einen fenster aus zu lesen, aber funktioniert nicht :(
DHandle:= FindWindow(NIL, 'MapleStory');
Ist das überhaupt möglich ? auch wenn es minimiert ist? Wenn es nicht möglich ist wenn es minimiert ist dann brauch ich es garnicht. nur 2. Frage; Ich hab mal von irgendjemanden das hier bekommen:
Delphi-Quellcode:
Weis jemand was ich machen muss damit es das keybd_event nur an ein bestimmtes window sendet ?
procedure EnterText(AText: String);
var lCount : Integer; lScanCode : Smallint; lWithAlt, lWithCtrl, lWithShift : Boolean; begin for lCount := 1 To Length(AText) Do begin lScanCode := VkKeyScan(AText[lCount]); //Ermitteln ob Shift gedrückt wurde lWithShift := lScanCode and (1 shl 8) <> 0; //Ermitteln ob Strg gedrückt wurde lWithCtrl := lScanCode and (1 shl 9) <> 0; //Ermitteln ob Alt gedrückt wurde lWithAlt := lScanCode and (1 shl 10) <> 0; if lWithShift then keybd_event(VK_SHIFT, 0, 0, 0); if lWithCtrl then keybd_event(VK_CONTROL, 0, 0, 0); if lWithAlt then keybd_event(VK_MENU, 0, 0, 0); keybd_event(lScanCode, 0, 0, 0); keybd_event(lScanCode, 0, KEYEVENTF_KEYUP, 0); if lWithAlt then keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0); if lWithCtrl then keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0); if lWithShift then keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0); end; end; |
Re: 2 fragen zu HWND und HWND+Canvas
Dein DHandle ist kein HWND sondern ein sogenannter Device Context, also das Handle einer Zeichenfläche. Um dieses Handle von einem anderen Fenster zu erhalten, musst du den Parameter von GetDC ändern.
![]() Die 2. Frage hat überhaupt nichts mit der ersten zu tun. Eröffne für sie bitte einen eigenen Thread. |
Re: 2 fragen zu HWND und HWND+Canvas
dankee!!
Aber am anfang steht doch
Delphi-Quellcode:
var
DCanvas: TCanvas; DHandle: HWND; // <---- HIER currentcaption, currentminus2: Integer; |
Re: 2 fragen zu HWND und HWND+Canvas
Das muss streng genommen HDC heißen, also Handle eines Device Contexts. Jedoch sind alle Handles (THandle, HDC, HWND, HHook, hFile und wie sie alle heißen) letztlich nur Cardinals und können vom Compiler auch nicht unterschieden werden.
|
Re: 2 fragen zu HWND und HWND+Canvas
wenn ich das jetzt richtig verstehe müsste das hier gehen ?!:
Delphi-Quellcode:
Hab es mal versucht auf dem desktop und es ging immernoch.
var
DCanvas: TCanvas; DHandle: HWND; damn: HWND; currentcaption, currentminus2: Integer; begin damn := FindWindow(NIL, 'MapleStory'); DHandle:=GetDC(damn); if DHandle<>0 then begin try DCanvas:=TCanvas.Create; try DCanvas.Handle:=DHandle; if DCanvas.Pixels[293, 335] = RGB(239, 239, 239 ) then begin Timer1.Enabled := false; Timer2.Enabled := false; Label4.Caption := inicurrent; Label4.Visible := true; Label5.Visible := true; Ini := TIniFile.Create(ExtractFilePath(ParamStr(0))+'LastPin_CorrectPin.txt'); Ini.WriteString('rCracker', 'Correct Pin', inicurrent); if Checkbox1.Checked = true then PlaySound(PChar('logged.wav'),0,SND_ASYNC or SND_LOOP); ShowMessage ('Eingeloggt, Pin ist: '+inicurrent); PlaySound(nil,0,0); end finally DCanvas.Free; end; finally if ReleaseDc(0, DHandle)<>1 then RaiseLastOSError; end; end else RaiseLastOSError; end; |
Re: 2 fragen zu HWND und HWND+Canvas
Zitat:
Übrigens solltest du auch ReleaseDC mit dem Handle aufrufen, zu den Api-Funktion sollte man immer in der MSDN schauen. |
Re: 2 fragen zu HWND und HWND+Canvas
is sollte ja eigentlich nur ingame gehen also im MapleStory window. Aber es hat die farbe auch auf dem desktop gefunden.
|
Re: 2 fragen zu HWND und HWND+Canvas
eigentlich müsste es so laut msdn funktionieren, aber geht irgendwie nicht, wer hat ne idee?
|
Re: 2 fragen zu HWND und HWND+Canvas
Ja, z.B. folgende: Maple malt nicht auf dem Window DC sondern auf einem Overlay wie z.B. von OpenGL oder DirectX.
(Ich sollte dazu erwähnen, dass mir Maple nichts sagt und ich auch nicht kenne) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:29 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz