Frage zum Auslesen von Bildschirminhalten



  • Weiss jemand welche Funktionen ich Call en muss bzw. was ich anstellen muss um Farben die gerade auf meinem PC Monitor angezeigt werden auszulesen.

    Nett wäre vlt ein kleines Beispiel in ASM wie ich zb rausbekomme welche Farbe gerade der Pixel mit den Koordinaten 100,200 hat. Und könnte man mir dann noch sagen ob dies nur auf dem Desktop geht oder auch wenn ich Programme oder PC-Spiele laufen habe.

    Vielen Dank schon mal für hilfe.

    MFG JanUlrich



  • Welches Betriebssystem?



  • Welcher Videomodus?



  • für windows schau dir doch mal das masm packet durch da ist ein programm dabei das den bildschirm "dreht" das sollte alles können was du brauchst.

    btw doping bringt fei beim programmieren nix :p



  • Mein Betriebssystem ist Windows XP (Professional 5.1.2600 SP 2)

    Was du mit Videomodus meinst kapier ich nicht? *peinlich*
    Ich befinde mich nicht im RealMode, habe eine Nvidia GForce 6600 Grafikkarte mit dem dazugehörigen Treiber von Nvidia Version 6.6.7.2 und auf meinem PC ist Direct X 9.0c installiert. Für die Grafikkarte wird IRQ kanal 16 benutzt.

    Falls es noch ne Rolle spielt: habe nen X86 - Prozessor von Intel

    Hoffe auf weiter Antworten.

    MFG JanUlrich



  • no_code schrieb:

    für windows schau dir doch mal das masm packet durch da ist ein programm dabei das den bildschirm "dreht" das sollte alles können was du brauchst.

    btw doping bringt fei beim programmieren nix :p

    🙄



  • no_code schrieb:

    no_code schrieb:

    für windows schau dir doch mal das masm packet durch da ist ein programm dabei das den bildschirm "dreht" das sollte alles können was du brauchst.

    btw doping bringt fei beim programmieren nix :p

    🙄

    wtf?`es ist noch früh am morgen, aber du zitierst hier dich selbst, nicht? 🙄



  • GetPixel()ist dein freund
    (nur Desktop - kein DirectX oder OGL)



  • /rant/ schrieb:

    no_code schrieb:

    no_code schrieb:

    für windows schau dir doch mal das masm packet durch da ist ein programm dabei das den bildschirm "dreht" das sollte alles können was du brauchst.

    btw doping bringt fei beim programmieren nix :p

    🙄

    wtf?`es ist noch früh am morgen, aber du zitierst hier dich selbst, nicht? 🙄

    ja klar, soll ich das nochmal abschreiben? steht doch alles drin was er wissen muß 🙄

    btw. wenn er zu lazy ist um sich die masm beispiele durchzuschauen ist er im assembler forum eh falsch...



  • nee sry no_code.

    als ich meinen 2ten Post gemacht hab konnte ich deinen irg wie noch gar nicht sehen. .... ^^ hab wohl so lange mit dem schreiben gebraucht. Ich geh jetzt erst mal essen und dann schau ich mich mal bei dem MASMPacket um.

    Auch für die anderen Antworten vielen dank.

    Ich meld mich wieder wenn ich weitere hilfe brauch.

    MFG euer absolut Dopingfreier JanUlrich xD

    EDIT: hier mein bisheriger Code:(ist mit dem Compiler WinAsm gemacht, hoffe ihr kommt damit zurecht)

    .386
    .model flat, stdcall 
    option casemap:none 
    
    include windows.inc
    include kernel32.inc  
    include user32.inc
    includelib kernel32.lib  
    includelib user32.lib
    
    include gdi32.inc
    includelib gdi32.lib
    
    .data 
    WindowClassName db 0
    WindowName db 0
    
    MsgBoxCaption  db "Pixel an Stelle 300,300",0 
    MsgBoxText     db 0
    MsgBoxTextAddr dd MsgBoxText
    
    .code 
    start: 
    
    invoke FindWindow,addr WindowClassName,addr WindowName
    invoke GetDC,eax
    invoke GetPixel, eax,300d,300d
    mov dword ptr [MsgBoxText],eax ;es wird einfach der komplette eax Wert in den String kopiert.
    invoke MessageBox, NULL, addr MsgBoxText, addr MsgBoxCaption, MB_OK  
    invoke ExitProcess,0
    end start
    

    Dazu hab ich noch eine weitere Frage. Wie macht ihr es denn wenn ihr einen Integer wert als Dezimalzahl in einer MsgBox ausgeben wollt.
    Also wenn ich in einer Variable den Wert A03h gespeicher habe will ich ne Funktion schreiben die dann eine MSGBox Mit dem inhalt : "2563" erstellt. Ein kleiner Tip für so etwas wäre nett.

    MFG JanUlrich



  • JanUlrich:
    Hattest du einen konkreten Grund, deine Frage im Assembler-Forum zu stellen? So weit sehe ich keinen Zusammenhang mit Assembler, ausser vielleicht dem weit verbreiteten Irrglauben auch nur leicht speziellere Hardware-I/O-Operationen seien nur via Assembler moeglich.

    Falls das oder Aehnliches zutrifft, ist dein Thema im Spiele-/Grafikprogrammierung-Forum sicher besser aufgehoben.



  • Nein ich wollte eigentlich nur ASM lernen (zwecks reversing ; was, wie ich gehört habe nur mit ASM kentnissen funktionieren soll) und das geht am besten mit praktischer Anwendung. Deshalb dachte ich, wenn ich schon etwas in ASM proggen will dann auch etwas das bei mir Verwendung findet und deswegen wollte ich eine abgewandelte Version der ImageSearch.dll machen (was in C genauso gehen würde ich aber Assembler lernen will). xD



  • vorsicht masm ist ein makro assembler, daher wäre es fürs reversen fast günstiger sich danach noch decompilierten c code anzuschauen



  • Naja, es wird reichen, wenn du ein Gefuehl fuer Assembler hast und die Grundlagen kennst. Dann waere es sicher hilfreich, wenn du viel mit Debuggern arbeitest. Z.B. an von dir erstellten Asm-Programmen, aber auch an anderen Programmen.

    MASM mag zur produktiven Arbeit vielleicht nett sein, da MASM-Code aber auch gern mal wie Hochsprachencode aussieht, ist dieser Assembler zum Einstieg vielleicht tendenziell weniger geeignet.



  • Jo ich schau mir ja auch oft den Code mit OllyDbg an oder löse CrackMe s.

    Trotzdem will ich etwas mit MASM programmieren.



  • JanUlrich schrieb:

    Ein kleiner Tip für so etwas wäre nett.

    http://www.asmcommunity.net/board/index.php?topic=28368.msg200778#msg200778



  • JanUlrich schrieb:

    Dazu hab ich noch eine weitere Frage. Wie macht ihr es denn wenn ihr einen Integer wert als Dezimalzahl in einer MsgBox ausgeben wollt.
    Also wenn ich in einer Variable den Wert A03h gespeicher habe will ich ne Funktion schreiben die dann eine MSGBox Mit dem inhalt : "2563" erstellt. Ein kleiner Tip für so etwas wäre nett.

    MFG JanUlrich

    Aber auch nur ein kleiner Tip 😉 :
    wenn man den Hexwert in AX mit dem Befehl Div durch eine Zahl dividiert, dann landet der Rest in Dx.
    Aber: DX muss vor jeder Division initialisiert werden (=0).



  • Nobuo T schrieb:

    MASM mag zur produktiven Arbeit vielleicht nett sein, da MASM-Code aber auch gern mal wie Hochsprachencode aussieht, ist dieser Assembler zum Einstieg vielleicht tendenziell weniger geeignet.

    man muss es einfach lieben 😃

    include masm32rt.inc
    .data?
    	sz db 256 dup (?)
    .code
    start: 
    fn MessageBox,0,cat$(ADDR sz,"RGB: 0x",hex$(rv(GetPixel,rv(GetDC,0),300,300))),"Titel", MB_OK   
    invoke ExitProcess,0 
    end start
    


  • Ich schmeiss mich weg! Das nenne ich ein gelungenes Beispiel! Damit haette sich das Thema ja dann wohl erledigt. 👍 😃



  • wieso heißt es hier "fn" und nicht "invoke" 😕


Log in to reply