Точка на экране

Обсуждение программ nnCron и nnCron LITE

Точка на экране

Postby starav » Sat, 10 Nov 2007, 10:25

Каким образом можно получить цвет точки на экране?
Если это возможно, то как проверить, входит ли этот цвет в определенный диапазон?
starav
 
Posts: 1
Joined: Sat, 10 Nov 2007, 10:20

Postby Yury Zhukov » Sat, 10 Nov 2007, 19:50

Code: Select all
GetPixel(GetDC(0), X, Y)
Yury Zhukov
 
Posts: 243
Joined: Thu, 16 Jun 2005, 09:22
Location: Москва

Postby VoidVolker » Sun, 11 Nov 2007, 01:04

Разве? http://www.math.msu.su/~vfnik/WinApi/g/getpixel.html А как бы тогда сразу весь экран получить? Типа штоб скриншоты кроном делать.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Postby SaMM » Sun, 11 Nov 2007, 01:45

Yury Zhukov wrote:
Code: Select all
GetPixel(GetDC(0), X, Y)

Вообще мне это не нужно, просто интересно стало.
Функция GetPixel

Описание:
function GetPixel(DC: HDC; X, Y: Integer): Longint;

Считывает цвет RGB в указанной точке.

Паpаметpы:
DC: Идентификатоp контекста устpойства.
X, Y: Пpовеpяемая точка.

Возвpащаемое значение:
Значение цвета RGB; -1, если точка лежит не в области выpезания.

функция находится в файле gdi32.dll

Code: Select all
#( test
NoActive
WINAPI: GetPixel gdi32.dll
Action:
100 100 0 GetPixel
MSG: "%0 esPICK%"
)#

Вообще не на что не реагирует, и всегда возвращает -1
Что сделал не так?
SaMM
 
Posts: 236
Joined: Fri, 25 Aug 2006, 12:33

Postby VoidVolker » Sun, 11 Nov 2007, 13:02

Вообще не на что не реагирует, и всегда возвращает -1
Что сделал не так?

Паpаметpы:
DC: Идентификатоp контекста устpойства.
X, Y: Пpовеpяемая точка.

Вот я и говорю - по-моему это не та функция, надо смотреть как целиком весь экран захватить.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Postby VoidVolker » Sun, 11 Nov 2007, 13:05

Вообще не на что не реагирует, и всегда возвращает -1
Что сделал не так?

Паpаметpы:
DC: Идентификатоp контекста устpойства.
X, Y: Пpовеpяемая точка.

Вот я и говорю - по-моему это не та функция, надо смотреть как целиком весь экран захватить.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Postby Yury Zhukov » Mon, 12 Nov 2007, 11:17

Небольшое уточнение, проверял, работает
Code: Select all
100 100 GetDesktopWindow GetWindowDC GetPixel
Yury Zhukov
 
Posts: 243
Joined: Thu, 16 Jun 2005, 09:22
Location: Москва

Postby Yury Zhukov » Mon, 12 Nov 2007, 11:47

VoidVolker wrote:надо смотреть как целиком весь экран захватить.

Как вариант, послать системе Сtrl+PrintScreen. Но что потом с этим чудом делать, как его записать а потом еще и прочитать?
Yury Zhukov
 
Posts: 243
Joined: Thu, 16 Jun 2005, 09:22
Location: Москва

Postby VoidVolker » Mon, 12 Nov 2007, 16:14

Небольшое уточнение, проверял, работает

Да, теперь работает:
Code: Select all
WINAPI: GetPixel gdi32.dll
: GET-PIXEL  ( x y -- RGB )
  GetDesktopWindow GetWindowDC GetPixel ;

Как вариант, послать системе Сtrl+PrintScreen. Но что потом с этим чудом делать, как его записать а потом еще и прочитать?

Это уже надо буфер обмена смотреть - как из него картинку получить. Через GET-PIXEL слишком долго будет весь экран сканировать.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Postby Yury Zhukov » Mon, 12 Nov 2007, 16:26

Только надо не забывать ReleaseDC вызывать, иначе все плохо будет.
Yury Zhukov
 
Posts: 243
Joined: Thu, 16 Jun 2005, 09:22
Location: Москва

Postby VoidVolker » Mon, 12 Nov 2007, 18:37

Только надо не забывать ReleaseDC вызывать, иначе все плохо будет.

Это еще зачем? По-моему оно только и делает что обнуляет ячейку памяти содержащуюю цвет, т.е. после применения ReleaseDC вместо цвета на стеке лежит ноль.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Postby Yury Zhukov » Mon, 12 Nov 2007, 18:42

The ReleaseDC function releases a device context (DC), freeing it for use by other applications. The effect of the ReleaseDC function depends on the type of device context. It frees only common and window device contexts. It has no effect on class or private device contexts.

Code: Select all
int ReleaseDC(
    HWND hWnd,   // handle of window
    HDC hDC    // handle of device context 
   );   


Parameters

hWnd
Identifies the window whose device context is to be released.

hDC
Identifies the device context to be released.

Return Values
The return value specifies whether the device context is released. If the device context is released, the return value is 1.
If the device context is not released, the return value is zero.

Remarks
The application must call the ReleaseDC function for each call to the GetWindowDC function and for each call to the GetDC function that retrieves a common device context.
Yury Zhukov
 
Posts: 243
Joined: Thu, 16 Jun 2005, 09:22
Location: Москва

Postby Yury Zhukov » Mon, 12 Nov 2007, 20:37

Заинтересовался снятием скриншотов через API. Вот что получилось:
Code: Select all
HDC mdc, sdc;
sdc = GetWindowDC(GetDesktopWindow());
mdc = CreateEnhMetaFile(sdc, "c:\\screenshot.emf", NULL, NULL);
BitBlt(mdc, 0, 0, GetDeviceCaps(sdc, DESKTOPHORZRES), GetDeviceCaps(sdc, DESKTOPVERTRES), sdc, 0, 0, SRCCOPY);
ReleaseDC(GetDesktopWindow(), sdc);
DeleteEnhMetaFile(CloseEnhMetaFile(mdc));

В файле c:\screenshot.emf будет изображение. Одна проблема: почему-то не работает с несколькими мониторами, выдает снимок только основного :(
Нас невозможно сбить с пути,
Нам пофигу куда идти.
Yury Zhukov
 
Posts: 243
Joined: Thu, 16 Jun 2005, 09:22
Location: Москва

Postby VoidVolker » Mon, 12 Nov 2007, 20:49

Тогда так получается надо:
Code: Select all
WINAPI: GetPixel gdi32.dll
: GET-PIXEL  ( x y -- RGB )
  SWAP GetDesktopWindow DUP >R GetWindowDC DUP >R GetPixel R> R> ReleaseDC DROP ;

24.10.09 Исправлен баг.
Last edited by VoidVolker on Sat, 24 Oct 2009, 08:13, edited 1 time in total.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Postby Yury Zhukov » Tue, 13 Nov 2007, 10:14

Все-таки замечательная вещь стек возвратов, надо будет приноровиться к нему.
P.S. А что со скриншотами?
Нас невозможно сбить с пути,
Нам пофигу куда идти.
Yury Zhukov
 
Posts: 243
Joined: Thu, 16 Jun 2005, 09:22
Location: Москва

Next

Return to nnCron forum (Russian)

Who is online

Users browsing this forum: Yahoo [Bot] and 2 guests

cron