Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
mat_for_c
217 / 210 / 77
Регистрация: 26.04.2013
Сообщений: 965
Завершенные тесты: 3
1

Пиксель экрана

01.03.2014, 23:51. Просмотров 1141. Ответов 18
Метки нет (Все метки)

а можно написать код, который смог бы сделать так, чтобы определенный пиксель экрана был, скажем, зеленого цвета? идеи сделать его битым не принимаются
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.03.2014, 23:51
Ответы с готовыми решениями:

Проверка закрашен ли пиксель
Необходимо приобразовать черно-белую картинку в массив, каждый черный пиксель в...

Как на SDL 2 нарисовать пиксель?
Делаю урок, но он для SDL 1.2, а во второй версии нету функции...

Как ложно выводить на монитор битый пиксель?
Здравствуйте!!! Сам я чайник ещё в программировании, но задался таким вопросом,...

Проверить, попал ли пиксель RGB-цвета в диапазон нужных цветов
Есть программа, которая смотрит в координаты и сверяет цвет пикселя в этих...

Что-то не так с OpenGL или головой, ошибка в один пиксель
Отрисовываю точку и прямоугольник в старой версии OpenGL через GLFW -...

18
FreeMan108
121 / 121 / 32
Регистрация: 04.03.2013
Сообщений: 370
01.03.2014, 23:52 2
Можно.
0
mat_for_c
217 / 210 / 77
Регистрация: 26.04.2013
Сообщений: 965
Завершенные тесты: 3
01.03.2014, 23:53  [ТС] 3
а как???
0
FreeMan108
121 / 121 / 32
Регистрация: 04.03.2013
Сообщений: 370
01.03.2014, 23:58 4
Лучший ответ Сообщение было отмечено mat_for_c как решение

Решение

Ладно... Смотри

C++
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#define WINVER 0x0500
#include <windows.h>
 
#define ID_TIMER_UP 100
 
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
 
char szClassName[ ] = "WindowsApp";
HINSTANCE hInst;
int cxScreen, cyScreen;
 
int WINAPI WinMain (HINSTANCE hInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)
 
{
    HWND hwnd;
    MSG msg;
    WNDCLASSEX wincl;
 
    wincl.hInstance = hInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WndProc;
    wincl.style = CS_DBLCLKS | CS_VREDRAW | CS_HREDRAW;
    wincl.cbSize = sizeof (WNDCLASSEX);
 
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;
    wincl.cbClsExtra = 0;
    wincl.cbWndExtra = 0;
 
    wincl.hbrBackground = (HBRUSH) CreateSolidBrush (RGB (255,0,255));
 
    if (!RegisterClassEx (&wincl))
        return 0;
    
    hInst = hInstance;
    cxScreen = GetSystemMetrics (SM_CXSCREEN);
    cyScreen = GetSystemMetrics (SM_CYSCREEN);
 
    hwnd = CreateWindowEx (
           WS_EX_LAYERED | WS_EX_TOPMOST | WS_EX_TRANSPARENT |
           WS_EX_NOACTIVATE | WS_EX_TOOLWINDOW,
           szClassName,
           "",
           WS_POPUP,
           0,
           0,
           cxScreen,
           cyScreen,
           HWND_DESKTOP,
           NULL,
           hInstance,
           NULL
           );
    SetTimer (hwnd, ID_TIMER_UP, 100, NULL);
    SetLayeredWindowAttributes (hwnd, RGB (255,0,255), 255, LWA_ALPHA | LWA_COLORKEY);
 
    ShowWindow (hwnd, nFunsterStil);
 
    while (GetMessage (&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    
    KillTimer (hwnd, ID_TIMER_UP);
    
    return msg.wParam;
}
 
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
        HDC hPaintDC;
        PAINTSTRUCT ps;
    switch (message)
    {
        case WM_CREATE:
             break;
        case WM_PAINT:
             hPaintDC = BeginPaint (hwnd, &ps);
             SetPixel (hPaintDC, 100, 100, RGB (0, 255, 0));
             EndPaint (hwnd, &ps);
             break;
        case WM_TIMER:
             switch (wParam)
             {
                    case ID_TIMER_UP:
                         SetWindowPos (hwnd, HWND_TOP, NULL, NULL, NULL, NULL, SWP_NOMOVE | SWP_NOSIZE);
                         break;
                    }
             break;
        case WM_DESTROY:
             DeleteObject ( (HGDIOBJ)SetClassLong (hwnd, GCL_HBRBACKGROUND, (LONG)GetStockObject (WHITE_BRUSH)) );
            PostQuitMessage (0);
            break;
        default:
            return DefWindowProc (hwnd, message, wParam, lParam);
    }
 
    return 0;
}
Добавлено через 3 минуты
Можно конечно проще, но тогда после обновления экрана сотрется.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <windows.h>
 
 
int WINAPI WinMain (HINSTANCE hInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)
 
{
     hDC = GetDC (0);
     SetPixel (hDC, 100, 100, RGB (0, 255, 0));
     ReleaseDC (0, hDC);
}
1
mat_for_c
217 / 210 / 77
Регистрация: 26.04.2013
Сообщений: 965
Завершенные тесты: 3
02.03.2014, 00:02  [ТС] 5
FreeMan108, пишет, что не может char* перевести в LPCWSTR

C++
1
wincl.lpszClassName = szClassName;
Добавлено через 1 минуту
C++
1
hDC = GetDC (0);
какой тип то указывать?
0
FreeMan108
121 / 121 / 32
Регистрация: 04.03.2013
Сообщений: 370
02.03.2014, 00:07 6
Ах да UNICODE
Исправь

C++
1
wchar_t szClassName[ ] = L"WindowsApp";
И в CreateWindow тоже перед кавычками поставь L

Добавлено через 3 минуты
Тип

C++
1
HDC hDC = GetDC (0);
0
mat_for_c
217 / 210 / 77
Регистрация: 26.04.2013
Сообщений: 965
Завершенные тесты: 3
02.03.2014, 00:17  [ТС] 7
а сколько она по времени то работает?
0
FreeMan108
121 / 121 / 32
Регистрация: 04.03.2013
Сообщений: 370
02.03.2014, 00:23 8
Она все время работает
Надо через диспетчер задач останавливать

Добавлено через 3 минуты
Вот лучше вариант

C++
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#define WINVER 0x0500
#include <windows.h>
 
#define ID_TIMER_UP 100
 
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
 
wchar_t szClassName[ ] = L"WindowsApp";
HINSTANCE hInst;
int cxScreen, cyScreen;
 
int WINAPI WinMain (HINSTANCE hInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)
 
{
    HWND hwnd;
    MSG msg;
    WNDCLASSEX wincl;
 
    wincl.hInstance = hInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WndProc;
    wincl.style = CS_DBLCLKS | CS_VREDRAW | CS_HREDRAW;
    wincl.cbSize = sizeof (WNDCLASSEX);
 
    wincl.hIcon = LoadIcon (NULL, IDI_HAND);
    wincl.hIconSm = LoadIcon (NULL, IDI_HAND);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;
    wincl.cbClsExtra = 0;
    wincl.cbWndExtra = 0;
 
    wincl.hbrBackground = (HBRUSH) CreateSolidBrush (RGB (255,0,255));
 
    if (!RegisterClassEx (&wincl))
        return 0;
    
    hInst = hInstance;
    cxScreen = GetSystemMetrics (SM_CXSCREEN);
    cyScreen = GetSystemMetrics (SM_CYSCREEN);
 
    hwnd = CreateWindowEx (
           WS_EX_LAYERED | WS_EX_TOPMOST | WS_EX_TRANSPARENT,
           szClassName,
           L"",
           WS_POPUP,
           0,
           0,
           cxScreen,
           cyScreen,
           HWND_DESKTOP,
           NULL,
           hInstance,
           NULL
           );
    SetTimer (hwnd, ID_TIMER_UP, 100, NULL);
    SetLayeredWindowAttributes (hwnd, RGB (255,0,255), 255, LWA_ALPHA | LWA_COLORKEY);
 
    ShowWindow (hwnd, nFunsterStil);
 
    while (GetMessage (&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    
    KillTimer (hwnd, ID_TIMER_UP);
    
    return msg.wParam;
}
 
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static HBRUSH hBrush;
    HGDIOBJ hOld;
    
        HDC hPaintDC;
        PAINTSTRUCT ps;
    switch (message)
    {
        case WM_CREATE:
            hBrush = CreateSolidBrush (RGB (0, 255, 0));
             break;
        case WM_PAINT:
             hPaintDC = BeginPaint (hwnd, &ps);
             hOld = SelectObject (hPaintDC, hBrush);
             Ellipse (hPaintDC, 100, 100, 200, 200);
             SelectObject (hPaintDC, hOld);
             EndPaint (hwnd, &ps);
             break;
        case WM_TIMER:
             switch (wParam)
             {
                    case ID_TIMER_UP:
                         SetWindowPos (hwnd, HWND_TOP, NULL, NULL, NULL, NULL, SWP_NOMOVE | SWP_NOSIZE);
                         break;
                    }
             break;
        case WM_DESTROY:
            DeleteObject (hBrush);
             DeleteObject ( (HGDIOBJ)SetClassLong (hwnd, GCL_HBRBACKGROUND, (LONG)GetStockObject (WHITE_BRUSH)) );
            PostQuitMessage (0);
            break;
        default:
            return DefWindowProc (hwnd, message, wParam, lParam);
    }
 
    return 0;
}
1
programina
2052 / 607 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
02.03.2014, 00:26 9
FreeMan108, а можно мне тоже зеленый пиксель? Только мне нужно не 1, а 90000 зеленых пикселей отдаленных друг от друга на 1-3 пикселя по всему экрану. Сможете?
0
FreeMan108
121 / 121 / 32
Регистрация: 04.03.2013
Сообщений: 370
02.03.2014, 00:43 10
Цитата Сообщение от programina Посмотреть сообщение
FreeMan108, а можно мне тоже зеленый пиксель? Только мне нужно не 1, а 90000 зеленых пикселей отдаленных друг от друга на 1-3 пикселя по всему экрану. Сможете?
Зеленый пиксель конечно можно, но из-за их количества уж наверное лучше иметь готовую картинку (bmp) с нужной сеткой. Так эффективнее.

Примерно то, что нужно.

C++
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#define WINVER 0x0500
#define UNICODE
#define _UNICODE
#include <windows.h>
 
#define ID_TIMER_UP 100
 
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
 
wchar_t szClassName[ ] = L"WindowsApp";
HINSTANCE hInst;
int cxScreen, cyScreen;
 
int WINAPI WinMain (HINSTANCE hInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)
 
{
    HWND hwnd;
    MSG msg;
    WNDCLASSEX wincl;
 
    wincl.hInstance = hInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WndProc;
    wincl.style = CS_DBLCLKS | CS_VREDRAW | CS_HREDRAW;
    wincl.cbSize = sizeof (WNDCLASSEX);
 
    wincl.hIcon = LoadIcon (NULL, IDI_HAND);
    wincl.hIconSm = LoadIcon (NULL, IDI_HAND);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;
    wincl.cbClsExtra = 0;
    wincl.cbWndExtra = 0;
 
    wincl.hbrBackground = (HBRUSH) CreateSolidBrush (RGB (255,0,255));
 
    if (!RegisterClassEx (&wincl))
        return 0;
    
    hInst = hInstance;
    cxScreen = GetSystemMetrics (SM_CXSCREEN);
    cyScreen = GetSystemMetrics (SM_CYSCREEN);
 
    hwnd = CreateWindowEx (
           WS_EX_LAYERED | WS_EX_TOPMOST | WS_EX_TRANSPARENT
           //| WS_EX_NOACTIVATE | WS_EX_TOOLWINDOW
           ,
           szClassName,
           L"",
           WS_POPUP,
           0,
           0,
           cxScreen,
           cyScreen,
           HWND_DESKTOP,
           NULL,
           hInstance,
           NULL
           );
    SetTimer (hwnd, ID_TIMER_UP, 100, NULL);
    SetLayeredWindowAttributes (hwnd, RGB (255,0,255), 255, LWA_ALPHA | LWA_COLORKEY);
 
    ShowWindow (hwnd, nFunsterStil);
 
    while (GetMessage (&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    
    KillTimer (hwnd, ID_TIMER_UP);
    
    return msg.wParam;
}
 
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
        static HBITMAP hScreen;
        static BITMAP bmpScreen;
        
        static HBRUSH hClassBrush;
        
        static RECT rcWnd;
        
        HDC hPaintDC, hDC, hMemDC;
        PAINTSTRUCT ps;
        HGDIOBJ hOld;
        
    switch (message)
    {
        case WM_CREATE:
             GetWindowRect (hwnd, &rcWnd);
             
             hClassBrush = (HBRUSH)GetClassLong (hwnd, GCL_HBRBACKGROUND);
             
             hDC = CreateIC (L"DISPLAY", NULL, NULL, NULL);
             hScreen = CreateCompatibleBitmap (hDC, cxScreen, cyScreen);
             hMemDC = CreateCompatibleDC (hDC);
             hOld = SelectObject (hMemDC, hScreen);
             FillRect (hMemDC, &rcWnd, (HBRUSH)hClassBrush);
             for (int x = 0; x < cxScreen; x+=3)
                for (int y = 0; y < cyScreen; y+=3)
                    SetPixel (hMemDC, x, y, RGB (0, 255, 0));
             SelectObject (hMemDC, hOld);
             DeleteDC (hMemDC);
             DeleteDC (hDC);
             
             GetObject (hScreen, sizeof (BITMAP), &bmpScreen);
             break;
        case WM_PAINT:
             hPaintDC = BeginPaint (hwnd, &ps);
             hMemDC = CreateCompatibleDC (hPaintDC);
             hOld = SelectObject (hMemDC, hScreen);
             
             BitBlt (
             hPaintDC,
             0, 0,
             bmpScreen.bmWidth, bmpScreen.bmHeight,
             hMemDC,
             0, 0,
             SRCCOPY );
             
             SelectObject (hMemDC, hOld);
             DeleteDC (hMemDC);
             EndPaint (hwnd, &ps);
             break;
        case WM_TIMER:
             switch (wParam)
             {
                    case ID_TIMER_UP:
                         SetWindowPos (hwnd, HWND_TOP, NULL, NULL, NULL, NULL, SWP_NOMOVE | SWP_NOSIZE);
                         break;
                    }
             break;
        case WM_DESTROY:
             DeleteObject (hScreen);
             DeleteObject ( (HGDIOBJ)SetClassLong (hwnd, GCL_HBRBACKGROUND, (LONG)GetStockObject (WHITE_BRUSH)) );
            PostQuitMessage (0);
            break;
        default:
            return DefWindowProc (hwnd, message, wParam, lParam);
    }
 
    return 0;
}
2
mat_for_c
217 / 210 / 77
Регистрация: 26.04.2013
Сообщений: 965
Завершенные тесты: 3
02.03.2014, 00:46  [ТС] 11
а вот чтоб в игре его было видно можно так сделать?
0
FreeMan108
121 / 121 / 32
Регистрация: 04.03.2013
Сообщений: 370
02.03.2014, 00:52 12
Этот пиксель будет видно в играх, но не во всех. Причиной тому является то, что некоторые игры делают так называемый "захват экрана", а чтобы туда еще свой пиксель припаять нужен прямой доступ к видеопамяти, а это уже надо какими-то фокусами делать.
1
DarkMasterW
4 / 4 / 1
Регистрация: 25.10.2013
Сообщений: 230
02.03.2014, 00:58 13
Это делается обычно через Overlay видеокарты. Надо DirectX ковырять. У самого мечта подобным образом логи вывести. Фишка оверлея в том, что в видеопамять изображение не загружается, а формируется непосредственно перед конвертированием в сигнал на монитор, но ПОСЛЕ формирования стандартного вывода. Т.е. вы в прямом смысле накладываете поверх выходного изображения свое, какое пожелаете.

Добавлено через 2 минуты
Кстати точно тот же самый процесс использует OverlayMixer в плеерах.
1
FreeMan108
121 / 121 / 32
Регистрация: 04.03.2013
Сообщений: 370
02.03.2014, 01:08 14
Цитата Сообщение от DarkMasterW Посмотреть сообщение
Т.е. вы в прямом смысле накладываете поверх выходного изображения свое, какое пожелаете.
Вот если бы еще где-то примерчик глянуть.
0
DarkMasterW
4 / 4 / 1
Регистрация: 25.10.2013
Сообщений: 230
02.03.2014, 01:36 15
Сам искал когда-то... Мне кидали пример... для делфика... Это на рабочий стол пламя выводит кажется.

Добавлено через 17 минут
Тьфу. А ссылку то не вставил. http://file.qip.ru/arch/Z4e0Z0LK/desktoponfire.html
0
FreeMan108
121 / 121 / 32
Регистрация: 04.03.2013
Сообщений: 370
02.03.2014, 13:57 16
Вот только примерчик не рабочий
0
DarkMasterW
4 / 4 / 1
Регистрация: 25.10.2013
Сообщений: 230
02.03.2014, 17:30 17
Другого нет, извиняйте. Попробуйте поискать в сторону OverlayMixer видео вывода. Вообще насколько знаю пример рабочий и оно работало...
Посмотрите еще тут статейку. Вроде неплохая.
http://www.delphimaster.ru/articles/directx/
1
FreeMan108
121 / 121 / 32
Регистрация: 04.03.2013
Сообщений: 370
02.03.2014, 18:48 18
Спасибо за все. Буду разбираться.
0
DarkMasterW
4 / 4 / 1
Регистрация: 25.10.2013
Сообщений: 230
02.03.2014, 21:09 19
Если разберетесь, пожалуйста, отпишитесь. Для меня очень интересная идея, но сам пока не вывезу.
0
02.03.2014, 21:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.03.2014, 21:09

Написать игру. В верхней части экрана летят 3 «звездочки»(***). В нижнем правом углу экрана находиться буква «О»
Написать игру. В верхней части экрана летят 3 «звездочки»(***). В нижнем правом...

Скриншот экрана
Мне нужно сделать скриншот экрана (того, что видит юзер ежесекундно). Перерыл...

Сканирование экрана
Здравствуйте, нужна помощь новичку по winapi. Нужно сделать сканирование...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru