Обсуждение программ nnCron и nnCron LITE
by starav » Sat, 10 Nov 2007, 10:25
Каким образом можно получить цвет точки на экране?
Если это возможно, то как проверить, входит ли этот цвет в определенный диапазон?
-
starav
-
- Posts: 1
- Joined: Sat, 10 Nov 2007, 10:20
by 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
by VoidVolker » Sun, 11 Nov 2007, 13:02
Вообще не на что не реагирует, и всегда возвращает -1 Что сделал не так?
Паpаметpы: DC: Идентификатоp контекста устpойства. X, Y: Пpовеpяемая точка.
Вот я и говорю - по-моему это не та функция, надо смотреть как целиком весь экран захватить.
-

VoidVolker
- Site Admin
-
- Posts: 2907
- Joined: Tue, 25 Apr 2006, 17:56
by VoidVolker » Sun, 11 Nov 2007, 13:05
Вообще не на что не реагирует, и всегда возвращает -1 Что сделал не так?
Паpаметpы: DC: Идентификатоp контекста устpойства. X, Y: Пpовеpяемая точка.
Вот я и говорю - по-моему это не та функция, надо смотреть как целиком весь экран захватить.
-

VoidVolker
- Site Admin
-
- Posts: 2907
- Joined: Tue, 25 Apr 2006, 17:56
by 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: Москва
by Yury Zhukov » Mon, 12 Nov 2007, 11:47
VoidVolker wrote:надо смотреть как целиком весь экран захватить.
Как вариант, послать системе Сtrl+PrintScreen. Но что потом с этим чудом делать, как его записать а потом еще и прочитать?
-
Yury Zhukov
-
- Posts: 243
- Joined: Thu, 16 Jun 2005, 09:22
- Location: Москва
by 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 слишком долго будет весь экран сканировать.
-

VoidVolker
- Site Admin
-
- Posts: 2907
- Joined: Tue, 25 Apr 2006, 17:56
by Yury Zhukov » Mon, 12 Nov 2007, 16:26
Только надо не забывать ReleaseDC вызывать, иначе все плохо будет.
-
Yury Zhukov
-
- Posts: 243
- Joined: Thu, 16 Jun 2005, 09:22
- Location: Москва
by VoidVolker » Mon, 12 Nov 2007, 18:37
Только надо не забывать ReleaseDC вызывать, иначе все плохо будет.
Это еще зачем? По-моему оно только и делает что обнуляет ячейку памяти содержащуюю цвет, т.е. после применения ReleaseDC вместо цвета на стеке лежит ноль.
-

VoidVolker
- Site Admin
-
- Posts: 2907
- Joined: Tue, 25 Apr 2006, 17:56
by 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: Москва
by 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: Москва
by 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.
-

VoidVolker
- Site Admin
-
- Posts: 2907
- Joined: Tue, 25 Apr 2006, 17:56
by Yury Zhukov » Tue, 13 Nov 2007, 10:14
Все-таки замечательная вещь стек возвратов, надо будет приноровиться к нему.
P.S. А что со скриншотами?
Нас невозможно сбить с пути,
Нам пофигу куда идти.
-
Yury Zhukov
-
- Posts: 243
- Joined: Thu, 16 Jun 2005, 09:22
- Location: Москва
Return to nnCron forum (Russian)
Who is online
Users browsing this forum: Exabot [Bot], Google [Bot] and 1 guest
|
|