Форум программистов, компьютерный форум, киберфорум
Pure Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/30: Рейтинг темы: голосов - 30, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 23.03.2015
Сообщений: 31

Поиск пиксела на экране

23.03.2015, 20:39. Показов 6593. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нашел тему.
вот топик.
Удалено
 Комментарий модератора 
Правила 5.8 Запрещено публиковать ссылки на другие форумы, а также их пропаганда.

Вот скрипт... но он ищет синею точку на картинке...
Помогите переделать на этом же языке PureBasic. чтоб поиск производился на определенных координатах
на Экране.. и искал красный пиксель.
и как найдет чтоб курсор переместился на него..
Я понимаю что я ЛОЛ...но не откажите..
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
EnableExplicit
 
#file = "D:\purebasic\pixel_finder\pixel.png"
#image = 0
#color_to_find = 16711680 ;000 000 255
 
UsePNGImageDecoder()
 
If LoadImage(#image, #file)
  Define x_counter.i = 0
  Define y_counter.i = 0
  If StartDrawing(ImageOutput(#image))
    For x_counter = 0 To ImageWidth(#image) - 1
      For y_counter = 0 To ImageWidth(#image) - 1
        If Point(x_counter, y_counter) = #color_to_find
          Debug "Finded BLUE Pixel at: " + Str(x_counter + 1) + " " + Str(y_counter + 1)
          Break
        EndIf
      Next
    Next
    StopDrawing()
  EndIf
  FreeImage(#image)
EndIf
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.03.2015, 20:39
Ответы с готовыми решениями:

Цвет пиксела на экране
Помогите, пожалуйста, сделать по-нормальному программу. В инете видел несколько примеров, но у меня они почему-то не работают. Мне нужно,...

Утечка памяти при мониторинге пиксела на экране
Здравствуйте. Таймер с интервалом 100 (С интервалом в 1000, тот же результат, только медленней). Постоянно следит за определенным пикселем...

Цветовой детектор - отслеживание цвета пиксела на экране
Нужно на C# сделать программу, которая в определенной позиции (например x=100, y=100) экрана будет считывать цвет пикселя. И если будет...

26
0 / 0 / 0
Регистрация: 23.03.2015
Сообщений: 31
25.03.2015, 22:56  [ТС]
Студворк — интернет-сервис помощи студентам
Pro_grammer, вот этот работает..
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
;Ищет пиксель указанного цвета в указанной прямоугольной области экрана
Procedure PixelSearch( left.i, top.i, right.i, bottom.i, color.l )
 
 DC= CreateDC_("DISPLAY",0,0,0); Дескриптор экрана
  If DC
    For i=left To right
      For j=top To bottom
        If color = GetPixel_(DC,i,j)
             DeleteDC_(dc)                 ; освобождает контекст устройства
          ProcedureReturn 1           ; выход из процедуры при первом совпадении
        EndIf  
      Next
    Next
      
  EndIf
  DeleteDC_(dc)
EndProcedure
; Авто mouse клик left button
Procedure Click_L_Mouse()
     mouse_event_(#MOUSEEVENTF_LEFTDOWN,0,0,0,0):Delay(10)  
     mouse_event_(#MOUSEEVENTF_LEFTUP,0,0,0,0):Delay(10)  
EndProcedure
 
 
Repeat
 
 If PixelSearch(665,150,695,170,RGB(86,6,12)) ; ищем красный верхний прямоугольник по данным вашего скрина
  ; Если цвет нашёл, то
  ; Кликнул мышкой 
   For i=1 To 3
       Click_L_Mouse() ; очередь из 3-х выстрелов
   Next
 EndIf  
 
  Delay(10)
ForEver
но медленно

Добавлено через 2 минуты
Pro_grammer, а последний ваш код не работает и пк начинает лагать

Добавлено через 8 минут
Pro_grammer, Я вот так сделал..работает код в поиске пикселя но медленно сканирует
заданную область...но как находит мгновенная реакция....
то есть как находит заданный пиксель - цвет..Hook делает следующее.
клик ЛКМ...и жмет клавиши 3..1...
с этим макросом мы обходим перезарядку оружия..
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
;=============================================================
;Ищет пиксель указанного цвета в указанной прямоугольной области экрана
Procedure PixelSearch( left.i, top.i, right.i, bottom.i, color.l )
 
 
 DC= CreateDC_("DISPLAY",0,0,0); Дескриптор экрана
  If DC
    For i=left To right
      For j=top To bottom
        If color = GetPixel_(DC,i,j)
             DeleteDC_(dc)                 ; освобождает контекст устройства
          ProcedureReturn 1           ; выход из процедуры при первом совпадении
        EndIf  
      Next
    Next
      
  EndIf
  DeleteDC_(dc)
EndProcedure
 
 
; Авто mouse клик left button
Procedure Click_L_Mouse()
  ;hUser32.l = GetModuleHandle_("user32.dll")
   ; hUser32.l = mouse_event_(#MOUSEEVENTF_LEFTDOWN,0,0,0,0):Delay(10)  
   ; hUser32.l = mouse_event_(#MOUSEEVENTF_LEFTUP,0,0,0,0):Delay(10)  
EndProcedure
;======================
Repeat
 
 If PixelSearch(665,50,695,370,$0000FF);RGB(255,0,0));+RGB(255,255,0)+RGB(0,0,255)) ; ищем красный верхний прямоугольник по данным вашего скрина
  ; Если цвет нашёл, то
  ; Кликнул мышкой 
   For i=1 To 1
    ; Click_L_Mouse() ; очередь из 3-х выстрелов
     RunProgram("pb_e.exe") ; запускаем Hook  для клика мышки
   Next
 EndIf  
ForEver
;======================
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
25.03.2015, 22:58
Цитата Сообщение от MyStErI Посмотреть сообщение
а последний ваш код не работает
Там нет полного кода, только процедура. Как ты вставил эту процедуру в свой код, покажи?
0
0 / 0 / 0
Регистрация: 23.03.2015
Сообщений: 31
25.03.2015, 23:12  [ТС]
Pro_grammer, Вот код pb_e.exe
который загружает Hook.dll и делает клик и жмет клавиши 3..1
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
Global hHookDll
 
Procedure.s CharToOem(String.s) 
  CharToOem_(@String, @String) 
  ProcedureReturn String 
EndProcedure 
 
Procedure.s SetHook(bSet) 
  If(bSet) ; Если устанавливаем 
    If(hHookDll) ; Если загружена библиотека      
      hpHookProc = GetProcAddress_(hHookDll, "MessageProc"); ; Получим адрес хук-функции      
      If(hpHookProc) ; Если успешно получен адрес ф-ции,               
        hHook = SetWindowsHookEx_(#WH_CALLWNDPROC,  hpHookProc, hHookDll, #Null)  
     
        If(hHook = #Null) ; Если хук не установился, вернем ошибку          
          ;ProcedureReturn "Хук не установлен" 
        Else
         ; ProcedureReturn "хук установлен"
           
        EndIf        
      Else        
        ;ProcedureReturn "Функцию HookProc не удалось загрузить из нашей библиотеки"        
      EndIf      
    Else      
      ;ProcedureReturn "Нашу библиотеку не удалось загрузить"     
    EndIf    
  Else     
    UnhookWindowsHookEx_(hHook)
    ;ProcedureReturn "хук снят"
  EndIf 
EndProcedure
 
hHookDll = LoadLibrary_("Hook.dll")
 
;OpenConsole()
 
 
PrintN(CharToOem(SetHook(#True)))
Repeat
  
  If GetKeyState_(#VK_CONTROL) = 1 
    PrintN(CharToOem(SetHook(#False)))
    Event=#PB_Event_CloseWindow
    Input()
  EndIf
 End
Until Event=#PB_Event_CloseWindow
 End
;1CloseConsole()
End
Добавлено через 3 минуты
Pro_grammer, Вот сам Hook.dll
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
Structure jmp_far 
  LongJump.b 
  LongJumpAdr.l 
EndStructure 
 
 
 
Global JmpW.jmp_far, JmpA.jmp_far 
Global OldW.jmp_far, OldA.jmp_far
 
Prototype pMessageBoxExW(hWnd, lpText,lpCaption,uType,wLanguageId)
Prototype pMessageBoxExA(hWnd, lpText,lpCaption,uType,wLanguageId)
 
Global MbwAdr, MbaAdr
 
Procedure NewMessageBoxExW(hWnd, lpText,lpCaption,uType,wLanguageId)
  WriteProcessMemory_(#INVALID_HANDLE_VALUE, MbwAdr, @OldW, SizeOf(OldW), @written)
  winMessageBoxExW.pMessageBoxExW = MbwAdr
  Result = winMessageBoxExW(hWnd, @"fdgfdgfdg2",lpCaption,uType,wLanguageId)
  WriteProcessMemory_(#INVALID_HANDLE_VALUE, MbwAdr, @JmpW, SizeOf(JmpW), @written) 
  ProcedureReturn Result
EndProcedure
 
Procedure NewMessageBoxExA(hWnd, lpText,lpCaption,uType,wLanguageId)
  WriteProcessMemory_(#INVALID_HANDLE_VALUE, MbaAdr, @OldA, SizeOf(OldA), @written)
  winMessageBoxExA.pMessageBoxExA = MbaAdr
  Result = winMessageBoxExA(hWnd, @"fdgfdgfdg1",lpCaption,uType,wLanguageId)
  WriteProcessMemory_(#INVALID_HANDLE_VALUE, MbaAdr, @JmpA, SizeOf(JmpA), @written) 
  ProcedureReturn Result
EndProcedure
 
Procedure SetHook()
  hUser32.l = GetModuleHandle_("user32.dll")
  ;hUser32. = GetModuleHandle_("user32.dll")
  MbwAdr  = GetProcAddress_(hUser32, "MessageBoxExW")
  MbaAdr  = GetProcAddress_(hUser32, "MessageBoxExA")
  ;===========================================================
       hUser32.l = mouse_event_(#MOUSEEVENTF_LEFTDOWN,0,0,0,0) : Delay(10)  
        hUser32.l = mouse_event_(#MOUSEEVENTF_LEFTUP,0,0,0,0) : Delay(10)  
       hUser32.l = keybd_event_(51,0,0,0) : Delay(12); Пауза 
       hUser32.l = keybd_event_(51,0,#KEYEVENTF_KEYUP,0) : Delay(35); Пауза 
       hUser32.l = keybd_event_(49,0,0,0) : Delay(12); Пауза 
       hUser32.l = keybd_event_(49,0,#KEYEVENTF_KEYUP,0) :Delay(12); Пауза 
     ;hUser32.l = keybd_event_(81, 0, 0, 0);
      ;Delay(200); Пауза 
      ;hUser32.l = keybd_event_(81, 0, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0);
      ;Delay(150); Пауза 
      ; hUser32.l = keybd_event_(81, 0, 0, 0);
      ;Delay(200); Пауза 
     ;hUser32.l = keybd_event_(81, 0, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0);
     ;Next
 
      ;=============================================================
  
  ReadProcessMemory_(#INVALID_HANDLE_VALUE, MbwAdr,  @OldW, SizeOf(OldW), @written) 
  ReadProcessMemory_(#INVALID_HANDLE_VALUE, MbaAdr,  @OldA, SizeOf(OldA), @written) 
  
  JmpW\LongJump = $E9
  JmpW\LongJumpAdr = (@NewMessageBoxExW()-MbwAdr)-5
  
  JmpA\LongJump = $E9
  JmpA\LongJumpAdr = (@NewMessageBoxExA()-MbaAdr)-5
  
  WriteProcessMemory_(#INVALID_HANDLE_VALUE, MbwAdr, @JmpW, SizeOf(JmpW), @written) 
  WriteProcessMemory_(#INVALID_HANDLE_VALUE, MbaAdr, @JmpA, SizeOf(JmpA), @written) 
EndProcedure
 
Procedure Unhook() 
  WriteProcessMemory_(#INVALID_HANDLE_VALUE, MbwAdr, @OldW, SizeOf(OldW), @written) 
  WriteProcessMemory_(#INVALID_HANDLE_VALUE, MbaAdr, @OldA, SizeOf(OldA), @written) 
EndProcedure
 
ProcedureDLL MessageProc(nCode,wParam,lParam)  
  ProcedureReturn CallNextHookEx_(#Null, nCode,wParam,lParam)
EndProcedure
 
ProcedureDLL AttachProcess(Instance)
  SetHook() 
EndProcedure
 
ProcedureDLL DetachProcess(Instance)   
  UnHook()
EndProcedure
Добавлено через 4 минуты
Pro_grammer, Моя система Win 8х64
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
25.03.2015, 23:14
Цитата Сообщение от MyStErI Посмотреть сообщение
.но как находит мгновенная реакция...
Это не так. Все тормоза не в поиске пикселя - там искать то нечего, всего 40х320, меньше секунды. У тебя всегда будет тормоз из за RunProgram("pb_e.exe") , более секунды программа запускается.
Надо весь код, что ты выше скопировал (код pb_e.exe ), вставить в программу.
ну и заменить старую процедуру PixelSearch( left.i, top.i, right.i, bottom.i, color.l )
на более быструю из этого топика Поиск пиксела на экране
Хотя это как я сказал не главное.
Удачи!
0
0 / 0 / 0
Регистрация: 23.03.2015
Сообщений: 31
25.03.2015, 23:18  [ТС]
Pro_grammer, Сделай чтоб было красиво...
Del
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
26.03.2015, 08:28
Сейчас внимательно посмотрел на код, который ты хуком называешь. Зачем это всё? Там изначально в примере перехватываются две функции MessageBoxExA и MessageBoxExW, и смысл в том, что когда любая программа вызывает окно с сообщением, то текст окна меняется на заданный в коде DLL.
ТЕБЕ ЭТО ЗАЧЕМ в кликере???
Реально нужный код записан тут
PureBasic
1
2
3
4
5
6
7
8
9
;===========================================================
       hUser32.l = mouse_event_(#MOUSEEVENTF_LEFTDOWN,0,0,0,0) : Delay(10)  
        hUser32.l = mouse_event_(#MOUSEEVENTF_LEFTUP,0,0,0,0) : Delay(10)  
       hUser32.l = keybd_event_(51,0,0,0) : Delay(12); Пауза 
       hUser32.l = keybd_event_(51,0,#KEYEVENTF_KEYUP,0) : Delay(35); Пауза 
       hUser32.l = keybd_event_(49,0,0,0) : Delay(12); Пауза 
       hUser32.l = keybd_event_(49,0,#KEYEVENTF_KEYUP,0) :Delay(12); Пауза 
 
      ;=============================================================
Но он тупо запускается при каждом вызове SetHook() посылает нажатие ЛКМ + число "31" и к хуку не имеет ни какого отношения!
И hUser32.l = совершенно лишнее, т.к. mouse_event и keybd_event не возвращают ни какие значения.
0
0 / 0 / 0
Регистрация: 23.03.2015
Сообщений: 31
09.05.2015, 13:04  [ТС]
Не подскажите, как в этот код вставить эмуляцию клика мышки и и клавиатуры?
Помогите.
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
hInpOut32 = OpenLibrary(#PB_Any, "INPOUT32.dll")
Out32 = GetFunction(hInpOut32, "Out32")
Inp32 = GetFunction(hInpOut32, "Inp32")
If Not CallFunctionFast(GetFunction(hInpOut32, "IsInpOutDriverOpen"))
   ; MessageRequester("","Нету драйвера InpOut")
  End
EndIf
 
 
;Тестирование интерфейса мыши  PS/2
time.i = GetTickCount_()
While GetTickCount_()-time<500
 If CallFunctionFast(Inp32,$64)& (1<<1)=0;2Bit=0,Входной буфер пуст
    CallFunctionFast(Out32,$64,$A9);Записываем команду самотестирования
     time = GetTickCount_()
     While GetTickCount_()-time<500
       If CallFunctionFast(Inp32,$64)& (1<<1)=0
         ;MessageRequester("","Тестирование успешно завершено.")
         End
        EndIf 
     Wend
    ; MessageRequester("","Неуспешна запись команды тестирования.")
     End
  EndIf
Wend
;MessageRequester("","Закончилось время ожидания,Входной буфер полон.")
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.05.2015, 13:04

Определить цвет пиксела в заданных координатах на экране
Программа при нажатии на button1 определяет открыт ли блокнот, обращается в координаты и если RGB цвет совпадает, то в textBox1 передает...

Как сделать так, чтобы при нажатии на кнопку прямоугольник перемещался на 2 пиксела вниз а если еще раз нажать то на два пиксела вверх
Привет Всем!!! Помогите справится с задачей, такая ситуация, как в Дельфи сделать так что бы при нажатии на кнопку прямоугольник...

Поиск пикселя и поиск изображения на экране
Переписываю код из clickermann для запуска его на C++. Мне нужны две функции которые выполняли бы сканирование экрана и поиск пикселя...

Поиск слова на экране
Нужно написать программу, которая найдет на экране &quot;запретное&quot; слово и заменит его выбранными знаками. Есть такая программка, которая...

Поиск изображения на экране
Нужно сделать метод, который будет искать на экране определённое изображение. Ни в каком месте, ни размер изображения нам заранее не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
27
Ответ Создать тему
Новые блоги и статьи
Просветление в 5 секунд
kumehtar 10.07.2026
Андрей Веретенников выдал фразу недавно: "Вам не обязательно кем-то себя считать"
Эксперимент с картинкой-обложкой на CodinGame
Adler 10.07.2026
Решил на днях провести эксперимент. У меня есть аккаунт на CodinGame, ТОП-3 по РФ среди 2200 участников (в разделе соревнования по программированию ИИ-ботов). Там есть обложка, куда можно влепить. . .
GitDOS: Когда я решил скрестить MS-DOS, GitHub и Claude
MaGz GoLd 08.07.2026
Привет, Киберфорум! Хочу поделиться своим проектом, который, надеюсь, вас заинтересует. GitDOS — это веб-приложение, которое позволяет запускать DOS в браузере с тремя крутыми фичами: диски живут в. . .
Учебный мини "цифровой двойник" = (Сервер = Java + Flask_питон )+(3D = Гугловскаая 4T nvideo + google colab) +( WMS = Odoo на Docker)
anaschu 07.07.2026
Увидел в требованиях к вакансии создателя имитационных моделей связку (REst + Api + WMS + Anylogic + питон + 3D Nvideo), и решил посмотреть, что это такое. Из этого всего я работал более менее. . .
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru