Pixel abfragen



  • Hallo,
    hab mich zum ersten mal auf einen Forum angemeldet, weil ich diese Antwort schon seit Wochen suche und einfach nichts finde...

    Ich verwende den Dev-C++ compiler. Mein Projekt ist ein windows application in C.
    Ich bin ein blutiger Anfänger was Programmieren betrifft.

    Also ich möchte ein Programm schreiben das ein paar Pixel auf dem Bildschirm beobachtet, wenn diese Pixel nun diese Pixel sind, die ich will, so soll die Schleife stoppen.

    So ungefähr:

    while(pixel != pixel){
    keybd_event(0x74,0,0,0);
    }

    Also er soll so lange F5 drücken bis die entsprechenden Pixel gefunden wurden.

    Mein Problem:

    Ich muss als erstes einmal einen einzelnen Pixel auslesen (den Farbcode), also den, den er nachher überprüfen soll, das wollte ich so machen:

    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
    
    int main(int argc, char *argv[]) {
    	HDC dc = GetDC(0);
    	COLORREF c = GetPixel(dc, 200, 500);
    	printf("r: %i, g: %i, b: %i\n",GetRValue(c), GetGValue(c),GetBValue(c));
    	ReleaseDC(0, dc);
    	system("PAUSE");
    	return 0;
    }
    

    Doch leider funktioniert das nicht, in der Konsole kommt immer nur: "Drücken sie eine beliebige Taste um ... ."



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (C89, C99 und C11) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • klaus1n3 schrieb:

    Also ich möchte ein Programm schreiben das ein paar Pixel auf dem Bildschirm beobachtet, wenn diese Pixel nun diese Pixel sind, die ich will, so soll die Schleife stoppen.

    So ungefähr:

    while(pixel != pixel){
    keybd_event(0x74,0,0,0);
    }

    Also er soll so lange F5 drücken bis die entsprechenden Pixel gefunden wurden.

    Eine Farbe erstellen kannst du mit dem RGB Makro. Diese kannst du mit der Rückgabe von GetPixel vergleichen, um somit die Abbruchbedingung der Schleife zu bestimmen. Vor und in der Schleife sollte die Pixelfarbe abgefragt werden. Nebenbei solltest du eine weitere Abbruchbedingung für die Schleife einsetzen, damit sie nicht zu einer Endlosschleife verkommt, wenn die richtige Pixelfarbe nicht gefunden werden kann. Das Senden der F5 Taste sollte direkt an das gewünschte Fenster gehen, somit wäre GetFocus empfehlenswert, womit du prüfen kannst, ob das richtige Fenster überhaupt fokussiert ist, und dann über SendMessage eine WM_KEYDOWN und WM_KEYUP Nachricht an das Fenster sendest, um das Drücken von F5 zu simulieren.

    klaus1n3 schrieb:

    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
    
    int main(int argc, char *argv[]) {
    	HDC dc = GetDC(0);
    	COLORREF c = GetPixel(dc, 200, 500);
    	printf("r: %i, g: %i, b: %i\n",GetRValue(c), GetGValue(c),GetBValue(c));
    	ReleaseDC(0, dc);
    	system("PAUSE");
    	return 0;
    }
    

    Doch leider funktioniert das nicht, in der Konsole kommt immer nur: "Drücken sie eine beliebige Taste um ... ."

    Also, bei mir kommt u.a. folgendes raus:

    r: 213, g: 241, b: 242
    Drücken Sie eine beliebige Taste . . .

    Dein Code ist richtig, der Fehler sollte woanders liegen.



  • Hey,

    er will mir einfach nicht die Farbwerte ausgeben...

    Könnte es am Compiler liegen? Welchen Compiler verwendest du? Ich verwende Dev-C++ 5.3.0.3. Mein Projekt ist ein Windows Application in C-Projekt. Bei den Projekt Optionen ist der Typ: Win32 GUI.

    MFG
    Klaus



  • Dev-C++ ist kein Compiler, sondern eine IDE.
    Ich verwende unter Windows MSVC, unter anderen Code::Blocks mit GCC.
    Mich wundert, dass dein Programm überhaupt kompiliert wird, weil du eigentlich eine Konsolen-Anwendung geschrieben (oder kopiert) hast. Eigentlich müsste der Compiler sich beschweren, dass er keine WinMain als Einstiegspunkt findet...



  • klaus1n3 schrieb:

    Also er soll so lange F5 drücken bis die entsprechenden Pixel gefunden wurden.

    und wenn die pixel nicht gefunden werden, drückt er sich an f5 die finger wund oda watt? 😕



  • Ja, er soll sich die Finger so richtig blutig drücken 😃



  • Wenn ich meinen Code in Win32 Konsole kompilieren will kommt folgende Meldung:

    file format not recognized; treating as linker script
    syntax error
    collect2: ld returned 1 exit status
    C:\Users\Klaus\Desktop\Test\Makefile.win [Error] [Projekt1.exe] Error 1 (if this is the only error: please check your library includes)

    Wenn ich diese Errors sehe, versteh ich gar nichts :S



  • ...



  • Hab's endlich hinbekommen! Nun spuckt meine Konsole auch die Farbwerte des Pixels aus ;).

    Ich hab code::blocks + compiler gedownloadet und die gdi32.lib eingebunden als linker :D.
    Danke für eurer Hilfe! Dachte nicht das ein "Forum" einen so viel weiter helfen kann 👍 .

    Naja... leider gibt es noch ein Problem, ich versteh nicht wie ich ein RGB Makro erstelle, also die Farbe. Ich war auch schon auf MSDN, aber versteh da nichts S:.

    Vielleicht könnt ihr mir bitte ein Code-Beispiel machen. Ich brauch die Farbe von diesen Hex-Code: 1f06a2.



  • klaus1n3 schrieb:

    Ich hab code::blocks + compiler gedownloadet und die gdi32.lib eingebunden als linker :D.

    Nur so zur Korrektur: du hast die gdi32.lib zum Linken eingebunden. Neben dem Compiler, welcher deine Quelldateien in binäre Objekte kompiliert, ist im Nachhinein ein Linker-Programm zum verbinden dieser zuständig, woraus sich dann deine fertige Anwendung (oder auch anderes) ergibt.

    klaus1n3 schrieb:

    Naja... leider gibt es noch ein Problem, ich versteh nicht wie ich ein RGB Makro erstelle, also die Farbe.

    Du selber erstellt schonmal kein Makro, RGB ist das Makro. Aussehen kann die Nutzung so:

    COLORREF red_color = RGB(255,0,0);
    

    Ich hoffe mal, du weißt, was es mit den 3 Farbkanälen und deren Wertebereich auf sich hat.

    klaus1n3 schrieb:

    Ich brauch die Farbe von diesen Hex-Code: 1f06a2.

    Rot ist 0x1f, Grün 0x06 und Blau 0xa2. Du kannst diese Werte, wie gerade geschrieben, als Parameter an RGB übergeben, um die entsprechende COLORREF zu erhalten.


Anmelden zum Antworten