Форум по 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
Подмигивание

Код:
этими командами мы узнаем цвет пикселя на экране по координатам X,Y

procedure TForm1.Button1Click(Sender: TObject);
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];//[X,Y]; цвет пикселя записывается в переменную AColor в виде color
AColor:=colortorgb(AColor);//переводим color в RGB

end;
end;

end.




[что касается эмуляции нажатия кнопок f1 и f8 код такой]
keybd_event(VK_F1, 0, 0, 0);// эмуляции нажатия кнопок в данном коде на F1

и вот может пригодится

Virtual Key Code	Corresponding key
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
__________________

Последний раз редактировалось 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 (всё в хронологическом порядке).

Привожу полный текст проги (тестовой, чисто проверить):
Код:
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,564
Версия 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,564
Версия Delphi: Delphi 7
Репутация: выкл
По умолчанию

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


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter