Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 06.10.2009, 22:31
Iskander Iskander вне форума
Прохожий
 
Регистрация: 06.10.2009
Сообщения: 8
Репутация: 10
Вопрос Помогите пожалуйста

Здравствуйте, уважаемые программисты;

Я весьма удачно похоже забрёл на этот форум. Дело в том, что у нас в школе программирование с Borland Delphi пока ещё на весьма детском уровне. Недавно прошли массивы ;

Я уже нашёл себе множество литературы по delphi, но объём информации, мне в данном случае ненужной, очень высок, и это меня привело в этот раздел. Вот такая задачка: ;

Есть полноэкранное приложение (игра), то ли OpenGL, то ли Direct3D, точно не скажу, сам не вдавался. Единственное, что нужно:
1. Програмно взять под контроль мышку и её передвижения, а так же эмулировать нажатия клавиатуры (левая кнопка мыши и клавиши F1-F8). Соответственно, нужно стукнуть мышкой в точку с данными координатами;
2. Из точки на экране с заданными координатами получить её RGB значение;

Именно для этих двух пунктов я и ничего не могу предпринять. Остальную часть программы я уже сделал. Дело в том, что я не знаю ни одного оператора по этим командам. И, скажите пожалуйста, нужно ли мне искать какую-нибудь библиотеку для этих операций, или стандартная SysUtils сгодится;
И, при этом, хорошо бы сделать движение мышки плавным (но это совсем не обязательно, главное - чтоб работало);

Заранее огромное спасибо!

И, если можно, посоветуйте литературу по этой тематике...

end.

Последний раз редактировалось Iskander, 06.10.2009 в 23:33.
Ответить с цитированием
  #2  
Старый 07.10.2009, 09:36
Iskander Iskander вне форума
Прохожий
 
Регистрация: 06.10.2009
Сообщения: 8
Репутация: 10
По умолчанию

После долгих блужданий по интернету я нашёл набор функций
setcursorpos
function GetPixel(DC: HDC; X, Y: Integer): Longint;
function GetDC(Wnd: HWnd): HDC;
function GetActiveWindow: HWnd;

Всё уже, казалось бы, готово, но компилятор никак не даёт завершить программу, пишет: Return value of function 'GetActiveWindow' might be undefined. Подскажите, в чём дело? Функция вроде простая, без параметров, вернёт мне индикатор активного окна, а всё равно не хочет.
Ответить с цитированием
  #3  
Старый 07.10.2009, 15:10
Аватар для The Shadow
The Shadow The Shadow вне форума
Продвинутый
 
Регистрация: 11.06.2007
Адрес: Уфа, Россия
Сообщения: 793
Репутация: 35
По умолчанию

Цитата:
Сообщение от Iskander
После долгих блужданий по интернету я нашёл набор функций
setcursorpos
function GetPixel(DC: HDC; X, Y: Integer): Longint;
function GetDC(Wnd: HWnd): HDC;
function GetActiveWindow: HWnd;

Всё уже, казалось бы, готово, но компилятор никак не даёт завершить программу, пишет: Return value of function 'GetActiveWindow' might be undefined. Подскажите, в чём дело? Функция вроде простая, без параметров, вернёт мне индикатор активного окна, а всё равно не хочет.
похоже что вы попытались ее объявить
__________________
Что делать, когда сломался комп:
1. Если вы юзер - делать ноги.
2. Если ремонтник - делать деньги.
3. Если вы программист - делать вид, что так было задумано.
Ответить с цитированием
  #4  
Старый 07.10.2009, 15:34
Iskander Iskander вне форума
Прохожий
 
Регистрация: 06.10.2009
Сообщения: 8
Репутация: 10
По умолчанию

Сейчас я ещё помучался (уверенно вроде программно контролю мышку).
Запор всё тот же:
Пытаюсь вывести цвет пиксела:

writeln(GetPixel(GetDC(0),x,y));

независимо ни от чего выводит 0.

По идее getDC(0) должен вернуть дескриптор для всего экрана, но пока всё, что происходит в компе, для меня остаётся загадкой.

Предыдущая проблема уже не актуальна, я с ней разобрался.

P.S. А в uses ничего кроме windows и SysUtils не надо?

Последний раз редактировалось Iskander, 07.10.2009 в 15:37.
Ответить с цитированием
  #5  
Старый 07.10.2009, 15:55
Аватар для The Shadow
The Shadow The Shadow вне форума
Продвинутый
 
Регистрация: 11.06.2007
Адрес: Уфа, Россия
Сообщения: 793
Репутация: 35
По умолчанию

х, у - переменные? у них какие значения?
__________________
Что делать, когда сломался комп:
1. Если вы юзер - делать ноги.
2. Если ремонтник - делать деньги.
3. Если вы программист - делать вид, что так было задумано.
Ответить с цитированием
  #6  
Старый 07.10.2009, 18:29
Аватар для -sanya-
-sanya- -sanya- вне форума
Новичок
 
Регистрация: 14.04.2009
Сообщения: 64
Репутация: 20
Подмигивание

Код:
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
<b><font color="Blue">этими командами мы узнаем цвет пикселя на экране по координатам <font color="DarkSlateGray">X,Y</font></font></b>
 
<font color="DarkRed">procedure TForm1.Button1Click(Sender: TObject);</font>
Var
 DesktopCanvas :TCanvas ;
 BitMap  :TBitMap;
 AColor:tcolor;
 
begin
  DesktopCanvas:=TCanvas.Create;
  DesktopCanvas.Handle:=GetDC(Hwnd_Desktop);
  BitMap := TBitMap.Create;
  BitMap.Width := Screen.Width;
  BitMap.Height:=Screen.Height;
  Bitmap.Canvas.CopyRect(Bitmap.Canvas.ClipRect,
  DesktopCanvas, DesktopCanvas.ClipRect);
 AColor:=Bitmap.Canvas.Pixels[15,30];/<font color="MediumTurquoise">/[X,Y]; цвет пикселя записывается в переменную AColor в виде color</font>
AColor:=colortorgb(AColor);<font color="MediumTurquoise">//переводим color в RGB</font>
 
end;
end;
 
<font color="DarkRed">end.</font>
 
 
 
 
<b><font color="Blue">[что касается эмуляции нажатия кнопок f1 и f8 код такой]</font></b>
keybd_event(VK_F1, 0, 0, 0);// эмуляции нажатия кнопок в данном коде на F1
 
<b><font color="Blue">и вот может пригодится</font></b>
 
<b><font color="Indigo">Virtual Key Code    Corresponding key</font></b>
<font color="Purple">VK_LBUTTON Left mouse button
VK_RBUTTON  Right mouse button
VK_CANCEL   Control+Break
VK_MBUTTON  Middle mouse button
VK_BACK     Backspace key
VK_TAB                  Tab key
VK_CLEAR    Clear key
VK_RETURN   Enter key
VK_SHIFT    Shift key
VK_CONTROL  Ctrl key
VK_MENU Alt key
VK_PAUSE    Pause key
VK_CAPITAL  Caps Lock key
VK_KANA     Used with IME
VK_HANGUL   Used with IME
VK_JUNJA    Used with IME
VK_FINAL                        Used with IME
VK_HANJA    Used with IME
VK_KANJI    Used with IME
VK_CONVERT  Used with IME
 
VK_NONCONVERT   Used with IME
VK_ACCEPT   Used with IME
VK_MODECHANGE   Used with IME
VK_ESCAPE   Esc key
VK_SPACE    Space bar(пробел)
VK_PRIOR    Page Up key
VK_NEXT                 Page Down key
VK_END                        End key
VK_HOME Home key
VK_LEFT                 Left Arrow key
VK_UP                        Up Arrow key
VK_RIGHT    Right Arrow key
VK_DOWN Down Arrow key
VK_SELECT   Select key
VK_PRINT    Print key (keyboard-specific)
VK_EXECUTE  Execute key
VK_SNAPSHOT Print Screen key
VK_INSERT   Insert key
VK_DELETE   Delete key
VK_HELP Help key
 
VK_LWIN                 Left Windows key (Microsoft keyboard)
VK_RWIN                     Right Windows key (Microsoft keyboard)
VK_APPS                        Applications key (Microsoft keyboard)
VK_NUMPAD0  0 key (numeric keypad)
VK_NUMPAD1  1 key (numeric keypad)
VK_NUMPAD2  2 key (numeric keypad)
VK_NUMPAD3  3 key (numeric keypad)
VK_NUMPAD4  4 key (numeric keypad)
VK_NUMPAD5  5 key (numeric keypad)
VK_NUMPAD6  6 key (numeric keypad)
VK_NUMPAD7  7 key (numeric keypad)
VK_NUMPAD8  8 key (numeric keypad)
VK_NUMPAD9  9 key (numeric keypad)
 
VK_MULTIPLY Multiply key (numeric keypad)
VK_ADD                        Add key (numeric keypad)
VK_SEPARATOR    Separator key (numeric keypad)
VK_SUBTRACT Subtract key (numeric keypad)
VK_DECIMAL  Decimal key (numeric keypad)
VK_DIVIDE   Divide key (numeric keypad)
VK_F1   F1 key
VK_F2   F2 key
VK_F3   F3 key
VK_F4   F4 key
VK_F5   F5 key
VK_F6   F6 key
VK_F7   F7 key
VK_F8   F8 key
VK_F9   F9 key
VK_F10  F10 key
VK_F11  F11 key
VK_F12  F12 key
VK_F13  F13 key
VK_F14  F14 key
VK_F15  F15 key
 
VK_F16  F16 key
VK_F17  F17 key
VK_F18  F18 key
VK_F19  F19 key
VK_F20  F20 key
VK_F21  F21 key
VK_F22  F22 key
VK_F23  F23 key
VK_F24  F24 key
VK_NUMLOCK  Num Lock key
VK_SCROLL   Scroll Lock key
VK_LSHIFT   Left Shift key (only used with GetAsyncKeyState and GetKeyState)
VK_RSHIFT   Right Shift key (only used with GetAsyncKeyState and GetKeyState)
VK_LCONTROL Left Ctrl key (only used with GetAsyncKeyState and GetKeyState)
VK_RCONTROL Right Ctrl key (only used with GetAsyncKeyState and GetKeyState)
 
VK_LMENU    Left Alt key (only used with GetAsyncKeyState and GetKeyState)
VK_RMENU    Right Alt key (only used with GetAsyncKeyState and GetKeyState)
VK_PROCESSKEY   Process key
VK_ATTN     Attn key
VK_CRSEL    CrSel key
VK_EXSEL    ExSel key
VK_EREOF    Erase EOF key
VK_PLAY     Play key
VK_ZOOM                      Zoom key
VK_NONAME   Reserved for future use
VK_PA1      PA1 key
VK_OEM_CLEAR    Clear key</font>
__________________

Последний раз редактировалось Admin, 07.10.2009 в 19:02.
Ответить с цитированием
  #7  
Старый 07.10.2009, 18:40
Iskander Iskander вне форума
Прохожий
 
Регистрация: 06.10.2009
Сообщения: 8
Репутация: 10
По умолчанию

Да какие там переменные... Просто координаты, которые у меня уже есть. типа, там, x=1450, а y=540 (у меня монитор 1680х1050).

Нашёл ещё один вариант:
screendc = CreateDC('DISPLAY', '', '', 0);
writeln(GetPixel(screendc,x,y));
DeleteDC(screendc);

Теперь он выводит с неопределённой периодичностью разные 10-и или 9-и значные коды (почему, блин, десятизначные? Вряд ли там альфа канал):
-1308549988 (да-да, именно минус)
855712513
1828791009
1828791009
1241588222
855712513
1241588222 (всё в хронологическом порядке).

Привожу полный текст проги (тестовой, чисто проверить):
Код:
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
program Cvet;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils,
  windows;
    
  var
  a,b:integer;
  screendc: HDC;
 
begin
 
readln(a,b);
sleep(3000);
setcursorpos(a,b);
sleep(500);
screendc:= CreateDC('DISPLAY', '', '', 0);
writeln(GetPixel(screendc,a,b));
DeleteDC(screendc);
 
readln;
 
end.

Последний раз редактировалось Admin, 07.10.2009 в 19:02.
Ответить с цитированием
  #8  
Старый 07.10.2009, 18:42
Iskander Iskander вне форума
Прохожий
 
Регистрация: 06.10.2009
Сообщения: 8
Репутация: 10
По умолчанию

Подождите, сейчас попробую.

Кстати, я имел в виду не только на форме, но и в любой другой точке (если вы так и на писали, то извините, сейчас я проверю).

Последний раз редактировалось Iskander, 07.10.2009 в 18:44.
Ответить с цитированием
  #9  
Старый 07.10.2009, 18:57
Аватар для -sanya-
-sanya- -sanya- вне форума
Новичок
 
Регистрация: 14.04.2009
Сообщения: 64
Репутация: 20
По умолчанию

именно в любой точке
__________________
Ответить с цитированием
  #10  
Старый 07.10.2009, 19:03
Аватар для Admin
Admin Admin вне форума
Администратор
 
Регистрация: 03.10.2005
Адрес: Россия, Москва
Сообщения: 1,553
Версия Delphi: Delphi 7
Репутация: выкл
По умолчанию

Выношу обоим замечание по оформлению кода, далее последуют санкции...
Ответить с цитированием
  #11  
Старый 07.10.2009, 19:10
Аватар для -sanya-
-sanya- -sanya- вне форума
Новичок
 
Регистрация: 14.04.2009
Сообщения: 64
Репутация: 20
По умолчанию

Admin замечания? убеш что-ли? я особо за сайт не держусь просто помогаю программистам и будующим программистам мож они в дальнейшем создадут легендарные программы а сайт у меня есть свой
и аккаунт мой можешь УДАЛИТЬ by
__________________
Ответить с цитированием
  #12  
Старый 07.10.2009, 19:20
Iskander Iskander вне форума
Прохожий
 
Регистрация: 06.10.2009
Сообщения: 8
Репутация: 10
По умолчанию

А можно реализовать всё это чисто в консольном режиме?

Всякие, там, дескрипторы окон, затем получить DC и через Getpyxel(HDC,x,y). А за команды эмуляции спасибо большое. А вот сама форма пока не получилась, но я сам разберусь (просто я недолюбливаю графический интерфейс). У меня даже в строке

Цитата:
DesktopCanvas.Handle:=GetDC(Hwnd_Desktop);

Вылезает

Undeclared Identifier 'Handle'

Последний раз редактировалось Iskander, 07.10.2009 в 19:26.
Ответить с цитированием
  #13  
Старый 07.10.2009, 19:27
Аватар для -sanya-
-sanya- -sanya- вне форума
Новичок
 
Регистрация: 14.04.2009
Сообщения: 64
Репутация: 20
По умолчанию

Цитата:
Сообщение от Iskander
А можно реализовать всё это чисто в консольном режиме?
можно, но я с консолю давно неработал, помоч немогу,
если ты хочеш перевести все чисто в паскаль
то там немного другие команды
__________________
Ответить с цитированием
  #14  
Старый 07.10.2009, 19:28
Iskander Iskander вне форума
Прохожий
 
Регистрация: 06.10.2009
Сообщения: 8
Репутация: 10
По умолчанию

Жаль. Спасибо огромное.
Ответить с цитированием
  #15  
Старый 07.10.2009, 19:33
Аватар для Admin
Admin Admin вне форума
Администратор
 
Регистрация: 03.10.2005
Адрес: Россия, Москва
Сообщения: 1,553
Версия Delphi: Delphi 7
Репутация: выкл
По умолчанию

Цитата:
Сообщение от -sanya-
Admin замечания? убеш что-ли? я особо за сайт не держусь просто помогаю программистам и будующим программистам мож они в дальнейшем создадут легендарные программы а сайт у меня есть свой
и аккаунт мой можешь УДАЛИТЬ by
Правила форума написаны для всех пользователей, и ты не исколючение.
ПС. Убивать не буду, просто попадешь на время в бан
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 14:02.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025