Avatar billede quiw Nybegynder
22. september 2005 - 19:40 Der er 12 kommentarer og
1 løsning

Pixel genkendelse..

Hej Eksperten.. Jeg fik en underlig idé om at lave et program.. Som automatisk klikker når en pixel har en bestemt farvekode..
- Altså.. F.eks et popup kommer op på skærmen et tilfældigt sted.. Så finder programmet ud af om den rammer den farve såen at musen automatisk klikker der..
- Programmering med Musen er intet problem.. Men er der nogle som har en idé til hvordan jeg får programmet til at genkende en pixelfarve på skærmen ? Og eventuelt angiver den X Y position pixelen er..
Avatar billede bertelbrander Novice
22. september 2005 - 19:57 #1
Du er nok nød til at scanne skærmen pixel for pixel.

Du starter med at få en DC der kan læse hele skærmen:
HDC dc = GetDC(0);

Så skanner du pixel for pixel og læser farven med
COLORREF Color = GetPixel(dc, x, y);
Og checker om Color har den rigtige værdi.
Avatar billede quiw Nybegynder
22. september 2005 - 20:48 #2
Hehe.. Håber ik det er for meget hvis jeg beder om et lille kode eksempel ? :)
Avatar billede bertelbrander Novice
22. september 2005 - 21:01 #3
#include <windows.h>
#include <iostream>

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

int main()
{
  const int Width = GetSystemMetrics(SM_CXFULLSCREEN);
  const int Height = GetSystemMetrics(SM_CYFULLSCREEN);

  HDC dc = GetDC(0);
  int x, y;
  for(y = 0; y < Height; y++)
      for(x = 0; x < Width; x++)
        if(GetPixel(dc, x, y) == ToFindColor)
            std::cout << "Found at: " << x << ", " << y << std::endl;

  ReleaseDC(0, dc);
}

Det er lidt langsomt, hvis det skal gå hurtigt skal man nok hente hele billedet på én gang og så læse fra dette billede.
Avatar billede quiw Nybegynder
22. september 2005 - 21:06 #4
Hmm.. Bruger DevC++ og får Linker error :S Noget jeg ska linke til ?
Avatar billede bertelbrander Novice
22. september 2005 - 21:26 #5
gdi32, jeg kan bygge med:

g++  rl.cpp -lgdi32
Avatar billede quiw Nybegynder
22. september 2005 - 21:59 #6
Det fungere fint nu.. Eller.. Bortset fra en fejl..
Når farverne er på 255,0,0 ramser den en masse pixels kordinater op.. Det er oss fint nok.. Men når jeg F.eks åbner paint og laver en farve der inde og taster RGB ind på den.. F.eks 129, 29, 32
- Så kommer der intet frem :S
Avatar billede quiw Nybegynder
22. september 2005 - 22:11 #7
Eller.. nej.. Den her kode sætter cursoren et helt andet sted på skærmen :S Altså nede i højre hjørne hver gang.. Når den burde sætte cursoren ved den fundne pixel
Har den her kode nu:
#include <windows.h>
#include <iostream>
using namespace std;

COLORREF ToFindColor = RGB(107, 0, 140);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
{
  const int Width = GetSystemMetrics(SM_CXFULLSCREEN);
  const int Height = GetSystemMetrics(SM_CYFULLSCREEN);
    POINT pt;
    RECT rc;

  HDC dc = GetDC(0);
  int x, y;
  for(y = 0; y < Height; y++)
      for(x = 0; x < Width; x++)
        if(GetPixel(dc, x, y) == ToFindColor)

            cout << "Found at: " << x << ", " << y << " \n";
            GetCursorPos(&pt);

            SetCursorPos(x, y);
            system("pause");
  ReleaseDC(0, dc);
  return 0;
}
Avatar billede bertelbrander Novice
22. september 2005 - 22:35 #8
Du mangler et sæt {}, vi programmerer i c++, ikke python:

#include <windows.h>
#include <iostream>
using namespace std;

COLORREF ToFindColor = RGB(255, 0, 0);
int main()
{
  const int Width = GetSystemMetrics(SM_CXFULLSCREEN);
  const int Height = GetSystemMetrics(SM_CYFULLSCREEN);
  POINT pt;
  RECT rc;

  HDC dc = GetDC(0);
  int x, y;
  for(y = 0; y < Height; y++)
      for(x = 0; x < Width; x++)
        if(GetPixel(dc, x, y) == ToFindColor)
        {
            cout << "Found at: " << x << ", " << y << " \n";
            GetCursorPos(&pt);
            SetCursorPos(x, y);
            system("pause");
            ReleaseDC(0, dc);
            return 0;
        }
  ReleaseDC(0, dc);
  return 0;
}
Avatar billede quiw Nybegynder
22. september 2005 - 22:56 #9
Årh Tak :) Det virker nu.. Men lige til sidst.. Kan du ikke lige give mig et par liniers kode til hvordan jeg får musen til at venstre klikke selv..
- Og smid lige et svar :)
Avatar billede bertelbrander Novice
22. september 2005 - 23:11 #10
Venstre musetast ned & op:

            INPUT Input;
            memset(&Input, 0, sizeof(Input));
            Input.type = INPUT_MOUSE;
            Input.mi.dx = x;
            Input.mi.dy = y;
            Input.mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
            SendInput(1, &Input, sizeof(INPUT));
            Input.mi.dwFlags = MOUSEEVENTF_LEFTUP;
            SendInput(1, &Input, sizeof(INPUT));

Du skal sansynligvis have denne linie INDEN #include <windows.h>.
#define _WIN32_WINNT 0x0403

Jeg samler ikke på point.
Avatar billede quiw Nybegynder
22. september 2005 - 23:22 #11
Okay.. Min kode ser nu såen her ud:
#include <windows.h>

#define _WIN32_WINNT 0x0403

#include <iostream>
using namespace std;

COLORREF ToFindColor = RGB(255, 0, 0);
int main()
{
  const int Width = GetSystemMetrics(SM_CXFULLSCREEN);
  const int Height = GetSystemMetrics(SM_CYFULLSCREEN);
  POINT pt;
  RECT rc;

  HDC dc = GetDC(0);
  int x, y;
  for(y = 0; y < Height; y++)
      for(x = 0; x < Width; x++)
        if(GetPixel(dc, x, y) == ToFindColor)
        {
            cout << "Found at: " << x << ", " << y << " \n";
            GetCursorPos(&pt);
            SetCursorPos(x, y);
            INPUT Input;
            memset(&Input, 0, sizeof(Input));
            Input.type = INPUT_MOUSE;
            Input.mi.dx = x;
            Input.mi.dy = y;
            Input.mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
            SendInput(1, &Input, sizeof(INPUT));
            Input.mi.dwFlags = MOUSEEVENTF_LEFTUP;
            SendInput(1, &Input, sizeof(INPUT));
            system("pause");
            ReleaseDC(0, dc);
            return 0;
        }
  ReleaseDC(0, dc);
  return 0;
}
- Men det fungere stadig ik.. Får en Builderror :S
Avatar billede bertelbrander Novice
23. september 2005 - 00:03 #12
Som jeg skrev skal #define _WIN32_WINNT 0x0403 stå INDEN #include <windows.h> dvs som det første i filen.
Avatar billede quiw Nybegynder
23. september 2005 - 09:51 #13
Ahh Ja :) Min fejl..
men hvis du ik samler på Point må jeg sige mange Tak :)
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester