Форум программистов, компьютерный форум CyberForum.ru

Пиксель экрана - C++

Восстановить пароль Регистрация
 
mat_for_c
 Аватар для mat_for_c
115 / 110 / 19
Регистрация: 26.04.2013
Сообщений: 584
Завершенные тесты: 2
01.03.2014, 23:51     Пиксель экрана #1
а можно написать код, который смог бы сделать так, чтобы определенный пиксель экрана был, скажем, зеленого цвета? идеи сделать его битым не принимаются
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
FreeMan108
 Аватар для FreeMan108
120 / 120 / 6
Регистрация: 04.03.2013
Сообщений: 368
01.03.2014, 23:52     Пиксель экрана #2
Можно.
mat_for_c
 Аватар для mat_for_c
115 / 110 / 19
Регистрация: 26.04.2013
Сообщений: 584
Завершенные тесты: 2
01.03.2014, 23:53  [ТС]     Пиксель экрана #3
а как???
FreeMan108
 Аватар для FreeMan108
120 / 120 / 6
Регистрация: 04.03.2013
Сообщений: 368
01.03.2014, 23:58     Пиксель экрана #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Ладно... Смотри

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);
}
mat_for_c
 Аватар для mat_for_c
115 / 110 / 19
Регистрация: 26.04.2013
Сообщений: 584
Завершенные тесты: 2
02.03.2014, 00:02  [ТС]     Пиксель экрана #5
FreeMan108, пишет, что не может char* перевести в LPCWSTR

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

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

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

C++
1
HDC hDC = GetDC (0);
mat_for_c
 Аватар для mat_for_c
115 / 110 / 19
Регистрация: 26.04.2013
Сообщений: 584
Завершенные тесты: 2
02.03.2014, 00:17  [ТС]     Пиксель экрана #7
а сколько она по времени то работает?
FreeMan108
 Аватар для FreeMan108
120 / 120 / 6
Регистрация: 04.03.2013
Сообщений: 368
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;
}
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
02.03.2014, 00:26     Пиксель экрана #9
FreeMan108, а можно мне тоже зеленый пиксель? Только мне нужно не 1, а 90000 зеленых пикселей отдаленных друг от друга на 1-3 пикселя по всему экрану. Сможете?
FreeMan108
 Аватар для FreeMan108
120 / 120 / 6
Регистрация: 04.03.2013
Сообщений: 368
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;
}
mat_for_c
 Аватар для mat_for_c
115 / 110 / 19
Регистрация: 26.04.2013
Сообщений: 584
Завершенные тесты: 2
02.03.2014, 00:46  [ТС]     Пиксель экрана #11
а вот чтоб в игре его было видно можно так сделать?
FreeMan108
 Аватар для FreeMan108
120 / 120 / 6
Регистрация: 04.03.2013
Сообщений: 368
02.03.2014, 00:52     Пиксель экрана #12
Этот пиксель будет видно в играх, но не во всех. Причиной тому является то, что некоторые игры делают так называемый "захват экрана", а чтобы туда еще свой пиксель припаять нужен прямой доступ к видеопамяти, а это уже надо какими-то фокусами делать.
DarkMasterW
4 / 4 / 0
Регистрация: 25.10.2013
Сообщений: 227
02.03.2014, 00:58     Пиксель экрана #13
Это делается обычно через Overlay видеокарты. Надо DirectX ковырять. У самого мечта подобным образом логи вывести. Фишка оверлея в том, что в видеопамять изображение не загружается, а формируется непосредственно перед конвертированием в сигнал на монитор, но ПОСЛЕ формирования стандартного вывода. Т.е. вы в прямом смысле накладываете поверх выходного изображения свое, какое пожелаете.

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

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

вывести сообщение если пиксель RGB цвета не попал в диапазон нужных цветов C++
C++ Проверка закрашен ли пиксель
C++ Как ложно выводить на монитор битый пиксель?

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

Или воспользуйтесь поиском по форуму:
DarkMasterW
4 / 4 / 0
Регистрация: 25.10.2013
Сообщений: 227
02.03.2014, 21:09     Пиксель экрана #19
Если разберетесь, пожалуйста, отпишитесь. Для меня очень интересная идея, но сам пока не вывезу.
Yandex
Объявления
02.03.2014, 21:09     Пиксель экрана
Ответ Создать тему
Опции темы

Текущее время: 01:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru