Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //LINK AGAINST gdi32, user32, kernel32 TO RUN CORRECTLY
- #include <windows.h>
- #include <iostream>
- #define Winver 0x500
- #include <tlhelp32.h>
- #include <stdio.h>
- #include <winable.h>
- #include <fstream>
- #include <istream>
- #include <string>
- #include <time.h>
- #include <sys/timeb.h>
- #include <vector>
- #include <algorithm>
- #include <sstream>
- #include <iterator>
- using namespace std;
- int ScreenWidth; //the width of the screen
- int ScreenHeight; //the height of the screen
- ofstream pixel_file; //to-be-written to file that will hold the pixel colors
- ifstream pixel_check; //to-be-read from file that holds the pixel colors
- bool operator == (vector<unsigned int> const& v1, vector<unsigned int> const& v2){ //for comparing 2 vectors
- return (v1[0] == v2[0]) && (v1[1] == v2[1]) && (v1[2] == v2[2]);
- }
- int getMilliCount(){ //timing function, used to test speed
- timeb tb;
- ftime(&tb);
- int nCount = tb.millitm + (tb.time & 0xfffff) * 1000;
- return nCount;
- }
- int getMilliSpan(int nTimeStart){ //timing function, used to test speed
- int nSpan = getMilliCount() - nTimeStart;
- if(nSpan < 0)
- nSpan += 0x100000 * 1000;
- return nSpan;
- }
- void mouseMove(int x_coord, int y_coord) //moves the mouse x and y amounts
- {
- INPUT mouse;
- memset(&mouse, 0, sizeof(INPUT));
- mouse.type = INPUT_MOUSE;
- // flag for the mouse hook to tell that it's a synthetic event.
- mouse.mi.dwExtraInfo = 0x200;
- mouse.mi.dx = x_coord;
- mouse.mi.dy = y_coord;
- mouse.mi.dwFlags = mouse.mi.dwFlags | MOUSEEVENTF_MOVE;
- SendInput(1, &mouse, sizeof(mouse));
- }
- int curr_color[2]; //the current pixel color
- unsigned int pix_data[1000][2]; //reference radius for specific size
- int pix_pos_piece[1]; //a pixel x, y coordinate
- int pix_pos_counter = 0; //the counter for all of the positions
- void get_bitmap_ava(HWND ava_hwnd, int size_x, int size_y, bool get_pixel_color = false) //grabs the bitmap
- {
- int pix_pos_full[size_x * size_y][1]; //use max possible positions just in case
- if(get_pixel_color){ //if the user pressed enter to grab pixels
- pixel_file.open("pixels.dat"); //open the write-to file
- }
- int pos_x, pos_y; //the starting x and y position
- pos_x = size_x / 2; //crosshairs are always center screen
- pos_y = size_y / 2;
- //POINT p; //used for special testing
- //GetCursorPos(&p);
- //pos_x = p.x;
- //pos_y = p.y;
- int radius = 10; //the amount of pixels to grab if saving pixel colors
- //int start = getMilliCount(); //track screenread speed in milliseconds
- //researching, unsure if needed
- //RECT myRect;
- //GetClientRect(ava_hwnd, (LPRECT)&myRect);
- //ClientToScreen(ava_hwnd, (LPPOINT)&myRect.left);
- //ClientToScreen(ava_hwnd, (LPPOINT)&myRect.top);
- HDC ava_dc = GetDC(ava_hwnd); //get the device context of the window
- HDC ava_dc_cap = CreateCompatibleDC(ava_dc); //create a compatible dc out of that
- HBITMAP hCaptureBitmap = CreateCompatibleBitmap(ava_dc, size_x, size_y); //make a bitmap
- SelectObject(ava_dc_cap, hCaptureBitmap); //select it in memory
- BitBlt(ava_dc_cap, 0, 0, size_x, size_y, ava_dc, 0, 0, SRCCOPY); //and bitblt it
- //getting the size of the picture
- BITMAP bm;
- GetObject(hCaptureBitmap, sizeof(bm), &bm);
- int width(bm.bmWidth), height(bm.bmHeight);
- //creating a bitmapheader for getting the dibits
- BITMAPINFOHEADER bminfoheader;
- ::ZeroMemory(&bminfoheader, sizeof(BITMAPINFOHEADER));
- bminfoheader.biSize = sizeof(BITMAPINFOHEADER);
- bminfoheader.biWidth = width;
- bminfoheader.biHeight = -height;
- bminfoheader.biPlanes = 1;
- bminfoheader.biBitCount = 32;
- bminfoheader.biCompression = BI_RGB;
- bminfoheader.biSizeImage = width * 4 * height;
- bminfoheader.biClrUsed = 0;
- bminfoheader.biClrImportant = 0;
- //ALL THAT IS COMMENTED OUT BELOW IS TO SAVE THE PICTURE TO A FILE
- /*DWORD dwBmpSize = ((size_x * bminfoheader.biBitCount + 31) / 32) * 4 * size_y;
- HANDLE hDIB = GlobalAlloc(GHND,dwBmpSize);
- char *lpbitmap = (char *)GlobalLock(hDIB);
- // Gets the "bits" from the bitmap and copies them into a buffer
- // which is pointed to by lpbitmap.
- GetDIBits(CreateCompatibleDC(0), hCaptureBitmap, 0,
- (UINT)bm.bmHeight,
- lpbitmap,
- (BITMAPINFO *)&bminfoheader, DIB_RGB_COLORS);
- // A file isz3 created, this is where we will save the screen capture.
- HANDLE hFile = CreateFile("captureqwsx.bmp",
- GENERIC_WRITE,
- 0,
- NULL,
- CREATE_ALWAYS,
- FILE_ATTRIBUTE_NORMAL, NULL);
- // Add the size of the headers to the size of the bitmap to get the total file size
- DWORD dwSizeofDIB = dwBmpSize + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
- BITMAPFILEHEADER bmfh;
- //Offset to where the actual bitmap bits start.
- bmfh.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER);
- //Size of the file
- bmfh.bfSize = dwSizeofDIB;
- //bfType must always be BM for Bitmaps
- bmfh.bfType = 0x4D42; //BM
- DWORD dwBytesWritten = 0;
- WriteFile(hFile, (LPSTR)&bmfh, sizeof(BITMAPFILEHEADER), &dwBytesWritten, NULL);
- WriteFile(hFile, (LPSTR)&bminfoheader, sizeof(BITMAPINFOHEADER), &dwBytesWritten, NULL);
- WriteFile(hFile, (LPSTR)lpbitmap, dwBmpSize, &dwBytesWritten, NULL);
- //Unlock and Free the DIB from the heap
- GlobalUnlock(hDIB);
- GlobalFree(hDIB);
- //Close the handle for the file that was created
- CloseHandle(hFile);*/
- //FILE SAVING PROCESS ENDS HERE
- //create a buffer and let the GetDIBits fill in the buffer
- unsigned char* pPixels = new unsigned char[(width * 4 * height)];
- if( !GetDIBits(CreateCompatibleDC(0), hCaptureBitmap, 0, height, pPixels, (BITMAPINFO*) &bminfoheader, DIB_RGB_COLORS)) // load pixel info
- {
- //return if fails but first delete the resources
- DeleteObject(hCaptureBitmap);
- delete [] pPixels; // delete the array of objects
- cout << "fail" << endl;
- return;
- }
- int x, y; // fill the x and y coordinate for grabbing pixels
- x = 0;
- y = 0;
- int total_found = 0; //the total amount of pixels matching pixels being searched for
- int previous_x = -1; //set the initial prev_x and y to -1 to avoid issues
- int previous_y = -1;
- for(int iter = 0; iter < (size_x * size_y); iter++){ //loop through all of the pixels in the screen
- if(x < size_x){ //if the pixels have not reached the right of the screen
- x++; //keep going
- }
- else{
- x = 0; //if they do reach the right, reset to the left
- y++; //and go down one row
- }
- unsigned int r = pPixels[(width*y+x) * 4 + 2]; //the pixel color in r g b color format
- unsigned int g = pPixels[(width*y+x) * 4 + 1];
- unsigned int b = pPixels[(width*y+x) * 4 + 0];
- curr_color[0] = r; //set the current color array values
- curr_color[1] = g; //old values wrote over with each new pixel
- curr_color[2] = b;
- pix_pos_piece[0] = x; //set the current position
- pix_pos_piece[1] = y; //wrote over with each new pixel
- if(!get_pixel_color){ //if we are looking for pixels (not saving them)
- bool done; //a bool to check if we have gone through the entire set of pixels to look for
- for(unsigned int iter2 = 0; iter2 < sizeof(pix_data)/sizeof(unsigned int); iter2++){
- if(abs(int(curr_color[0] - pix_data[iter2][0])) < 1 && abs(int(curr_color[1] - pix_data[iter2][1])) < 1 && abs(int(curr_color[2] - pix_data[iter2][2])) < 1){
- //if all of the current pixel colors are within 1 color difference of the pixels being searched for
- break; //exit the loop
- }
- if(sizeof(pix_data)/sizeof(unsigned int) - 1 == iter2){ //if it reaches the end of the loop
- done = true;
- }
- }
- if((abs(int(previous_x - x)) < 50 || abs(int(previous_y - y))) < 50 && (!done)){
- //if the found pixels are within 50 pixels of the last found ones
- total_found++; //increment the total found
- pix_pos_full[pix_pos_counter][0] = pix_pos_piece[0]; //fill in the pix_pos array
- pix_pos_full[pix_pos_counter][1] = pix_pos_piece[1]; //with the x, y values of the current pixel
- }
- else{ //if they were not found within 50 pixels or not the right color
- total_found = 0; //reset the total found (needs to be a grouping to match a pattern)
- pix_pos_counter = 0; //reset the pix_pos_counter
- }
- }
- if(get_pixel_color){ //if the user wants to save pixels
- if(abs(x - pos_x) < radius && abs(y - pos_y) < radius){ //if the x and y positions of the pixels are within radius amount of the center of the screen
- pixel_file << r << " " << g << " " << b << "\n"; //write the r g b to the file
- }
- }
- }
- cout << total_found << endl; //for testing purposes, to see how many were found. Currently, either 0 or all of them are "found"
- if(!get_pixel_color){ //make sure the user did not want to save pixels
- if(total_found > 6){ //if more than 6 were found (arbitrary number, will be worked into percentage later)
- int other_x_pos = pix_pos_full[(sizeof(pix_pos_full)/sizeof(int))/2][0]; //grab the center position
- int other_y_pos = pix_pos_full[(sizeof(pix_pos_full)/sizeof(int))/2][1]; //of the pixel positions
- //if(other_x_pos > pos_x){
- //cout << other_x_pos << endl;
- //I am having trouble determining how much to move
- //the mouse moves by x amount (the distance between pos_x and other_pos_x)
- //but I can't determine it correctly
- cout << pos_x - other_x_pos << endl;
- cout << pos_y - other_y_pos << endl;
- mouseMove(pos_x - other_x_pos, pos_y - other_y_pos);
- //}
- //else if(other_x_pos < pos_x){
- // mouseMove(other_x_pos - pos_x, other_y_pos - pos_y);
- //}
- }
- }
- total_found = 0; //reset the variables
- pix_pos_counter = 0; //for the next screen grab
- if(get_pixel_color){ //if the save-to file was opened
- pixel_file.close(); //close it
- }
- //clean up the bitmap and buffer unless you still need it
- DeleteObject(hCaptureBitmap);
- delete [] pPixels; // delete the array of objects
- ReleaseDC(ava_hwnd, ava_dc);
- DeleteDC(ava_dc_cap);
- DeleteObject(hCaptureBitmap);
- //int end = getMilliSpan(start);
- //cout << end << endl;
- }
- int main()
- {
- //use for testing
- /*RECT desktop_rect;
- HWND desktop_hwnd;
- desktop_hwnd = GetDesktopWindow();
- GetWindowRect(desktop_hwnd, &desktop_rect);
- while(true){
- if((GetKeyState(VK_RETURN) & 0x80) != 0){
- get_bitmap_ava(desktop_hwnd, desktop_rect.right, desktop_rect.bottom, true);
- Sleep(500);
- }
- if((GetKeyState(VK_LBUTTON) & 0x80) != 0){
- get_bitmap_ava(desktop_hwnd, desktop_rect.right, desktop_rect.bottom);
- }
- if((GetKeyState(VK_END) & 0x80) != 0){
- pixel_file.close();
- break;
- }
- }
- return 0;*/
- pixel_check.open("pixels.dat"); //the file that contains pixels to look for
- string line; //a line to hold each set up numbers
- if(pixel_check.is_open()){ //if the file open ok
- vector<string> tokens; //to hold the 3 numbers as strings
- unsigned int tokints[2]; //to hold the 3 numbers as ints
- int counter = 0; //indexing for the pix_data array
- while(getline(pixel_check,line)){ //get each line in the file
- istringstream iss(line); //create a stringstream
- copy(istream_iterator<string>(iss), istream_iterator<string>(), back_inserter<vector<string> >(tokens)); //copy the sstream elements into tokens
- for(unsigned int it = 0; it < tokens.size(); it++){
- tokints[it] = atoi(tokens.at(it).c_str()); //and convert/ copy tokens into tokints as ints
- }
- pix_data[counter][0] = tokints[0]; //fill pix_data
- pix_data[counter][1] = tokints[1];
- pix_data[counter][2] = tokints[2];
- counter++;
- }
- }
- pixel_check.close(); //close the file
- //normally the resolution is grabbed here, but I am hiding the game's name
- //there is also a block of code to check when the game is the active window
- //I'm hiding that too
- while(true){
- if((GetKeyState(VK_RETURN) & 0x80) != 0){ //if the user presses enter
- get_bitmap_ava(ava_wind, ScreenWidth, ScreenHeight, true); //screen read and save the pixels the center of the screen is on
- Sleep(500);
- }
- if((GetKeyState(VK_LBUTTON) & 0x80) != 0){ //if the user left-clicks
- get_bitmap_ava(ava_wind, ScreenWidth, ScreenHeight); //screen read and search for pixels
- Sleep(100);
- }
- if((GetKeyState(VK_END) & 0x80) != 0){ //killswitch
- break;
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement